Provided by: manpages-nl-dev_4.21.0-2_all 

NAAM
sigaction, rt_sigaction - onderzoek en verander een signaal actie
BIBLIOTHEEK
Standard C bibliotheek (libc, -lc)
SAMENVATTING
#include <stdio.h>
int sigaction(int signum, const struct sigaction *restrict act,
struct sigaction *_NULL_baar restrict oudeact);
Feature Test Macro´s eisen in glibc (zie feature_test_macros(7)):
sigaction():
_POSIX_C_SOURCE
siginfo_t:
_POSIX_C_SOURCE >= 199309L
BESCHRIJVING
De sigaction() systeem aanroep wordt gebruikt om de te nemen actie door een proces bij ontvangst van een
signaal te veranderen. (Zie signal(7) voor een overzicht van de signalen.)
signum bepaald het signaal en kan elk geldig signaal zijn behalve SIGKILL en SIGSTOP.
Als act on-gelijk nul is wordt de nieuwe actie voor het signaal signum geïnstalleerd van act. Als oudeact
niet-nul is, dan wordt de vorige actie bewaard in oudeact.
De sigaction structuur is bepaald als
struct sigaction {
void (*sa_handler)(int);
void (*sa_sigaction)(int, siginfo_t *, void *);
sigset_t sa_mask;
int sa_flags;
void (*sa_restorer)(void);
};
Op sommige architecturen wordt een union gebruikt: ken niet aan beiden sa_handler en sa_sigaction toe
Het sa_restorer veld is is niet bedoeld voor gebruik in applicaties. (POSIX specificeert het sa_restorer
veld niet.) Meer details over het doel van dit veld kunnen worden gevonden in sigreturn(2)
sa_handler specificeert de actie die wordt geassocieerd met signum en die kan een van de volgende zijn:
• SIG_DFL voor de standaard actie.
• SIG_IGN om dit signaal te negeren.
• Een wijzen naar een signaal afhandel functie. Deze functie ontvangt het signaal nummer als zijn enige
argument.
Als SA_SIGINFO werd opgegeven in sa_flags dan specificeert sa_sigaction (in plaats van sa_handler) de
signaal afhandel functie voor signum. Deze functie ontvangt drie argumenten zoals hieronder beschreven.
sa_mask specificeert een masker voor signalen die geblokkeerd zouden moeten worden (dat is, toegevoegd
aan een signaal masker van de thread in welke de signaal afhandelaar wordt aangeroepen) tijdens de
uitvoering van de signaal afhandelaar. In toevoeging daarop zal het signaal dat de behandelaar af liet
gaan geblokkeerd worden, tenzij de SA_NODEFER vlag werd gebruikt.
sa_flags geeft een aantal vlaggen op die het gedrag van het signaal behandelings proces aanpassen. Het
wordt gevormd door de bitsgewijze OF van nul of meer van het volgende:
SA_NOCLDSTOP
Als signum SIGCHLD is, ontvang geen bericht wanneer kind processen stoppen (dat is, wanneer deze
een van SIGSTOP, SIGTSTP, SIGTTIN of SIGTTOU ontvangen) of ga door (dat is, ze ontvangen SIGCONT)
(zie wait(2)). Deze vlag is alleen van betekenis bij het inrichten van een afhandelaar voor
SIGCHLD.
SA_NOCLDWAIT (sinds Linux 2.6)
Als signum gelijk is aan SIGCHLD transformeer dan kinderen niet in zombies wanneer zij eindigen.
Zie ook waitpid(2). Deze vlag is alleen van betekenis bij het inrichten van een afhandelaar voor
SIGCHLD, of bij het zetten van een signaal dispositie op SIG_DFL.
Als de SA_NOCLDWAIT vlag werd gezet bij het inrichten van een afhandelaar voor SIGCHLD, dan laat
POSIX.1 het ongespecificeerd of een SIGCHLD signaal wordt gegenereerd zodra een kind proces
eindigt. Op Linux, wordt een SIGCHLD in dit geval gegenereerd; op sommige andere implementaties
is dit niet het geval .
SA_NODEFER
Voeg geen signaal toe aan het thread signaal masker terwijl de afhandelaar wordt uitgevoerd,
behalve als het signaal werd opgegeven in act.sa_mask. Bijgevolg mag een volgende instantie van
het signaal worden afgeleverd bij de thread terwijl deze de afhandelaar uitvoert. Deze vlag is
alleen van betekenis bij het inrichten van de signaal afhandelaar.
SA_NOMASK is een overbodig, niet-standaard synoniem voor deze vlag.
SA_ONSTACK
Roep de signaal afhandelaar aan op een alternatieve stack voorzien door signalstack(2). Indien een
alternatieve stack niet beschikbaar is, dan wordt de standaard stack gebruikt. Deze vlag is alleen
van betekenis bij het inrichten van een signaal afhandelaar.
SA_RESETHAND
Herstel de signaal actie naar de standaard bij het binnengaan in de signaal afhandelaar. Deze vlag
is alleen van betekenis bij het inrichten van een signaal afhandelaar.
SA_ONESHOT is een verouderd, niet-standaard synoniem voor deze vlag.
SA_RESTART
Voorzie in gedrag overeenkomend met BSD signaal-semantiek bij het herstartbaar maken langs
signalen van bepaalde systeem aanroepen. Deze vlag heeft alleen betekenis bij het inrichten van
een signaal afhandelaar. Zie signal(7) voor een discussie over het herstarten van een systeem
aanroep.
SA_RESTORER
Not intended for application use. Deze vlag wordt gebruikt door C bibliotheken om aan te geven
dat het sa_restorer veld het adres van een "signaal trampoline" bevat. Zie sigreturn(2) voor
meer details.
SA_SIGINFO (sinds Linux 2.2)
De signaal afhandelaar neemt drie argumenten, niet een. In dit geval zou sa_sigaction gezet moeten
zijn in plaats van sa_handler. Deze vlaggen is alleen van betekenis bij het inrichten van een
signaal afhandelaar.
SA_UNSUPPORTED (vanaf Linux 5.11)
Gebruikt om dynamisch op vlag bit ondersteuning te polsen.
Zodra een poging om een afhandelaar te registreren slaagde met deze vlag gezet in act->sa_flags
samen met andere vlaggen die potentieel niet ondersteund worden door de kernel, dan zal een meteen
opeenvolgende sigaction() aanroep die hetzelfde signaal nummer opgeeft en een niet-NULL oudeact
argument resulteren in een SA_UNSUPPORTED clear in oudeact->sa_flags, waarna oudeact->sa_flags mag
worden gebruikt als een bit-masker beschrijvend welke van de potentieel niet ondersteunde vlaggen
in feite wél worden ondersteund. Zie de sectie "Dynamisch polsen op vlag bit ondersteuning" voor
meer details.
SA_EXPOSE_TAGBITS (vanaf Linux 5.11)
Normaliter, wordt bij het afleveren van een signaal een architecture-specifieke verzameling
tag-bits gewist in het si_addr veld van siginfo_t. Als deze vlag is gezet dan wordt een
architecture-specifieke deelverzameling van de tag-bits behouden in si_addr.
Programma´s die overdraagbaar moeten zijn met Linux versies ouder dan 5.11 moeten SA_UNSUPPORTED
gebruiken om te testen op ondersteuning.
Het siginfo_t argument voor een SA_SIGINFO afhandelaar
Indien de SA_SIGINFO vlag werd gespecificeerd in act.sa_flags dan wordt het adres van de afhandelaar
doorgegeven via het act.sa_sigaction veld. Deze afhandelaar heeft drie argumenten, die zijn als volgt:
void
handler(int sig, siginfo_t *info, void *ucontext)
{
...
}
Deze drie argumenten zijn als volgt
sig Het nummer van het signaal de de aanroep van de afhandelaar veroorzaakte.
info Een wijzer naar een siginfo_t, hetgeen een structure is die verdere informatie bevat over het
hieronder beschreven signaal.
ucontext
Dit is een wijzer naar een ucontext_t structure, cast naar void *. De structure aangewezen door
dit veld bevat signaal context informatie die werd bewaard in de gebruikers-stack door de kernel;
zie sigreturn(2) voor details. Verdere informatie over de ucontext_t structure kan worden gevonden
in getcontext(3) en signal(7). In het algemeen maakt de afhandelaar functie geen gebruik van het
derde argument.
Het siginfo_t data type is een structure met de volgende velden:
siginfo_t {
int si_signo; /* Signaal nummer */
int si_errno; /* Een fout waarde */
int si_code; /* Signaal code */
int si_trapno; /* Trap nummer dat het
hardware-gegenereerde signaal veroorzaakte
(ongebruikt op de meeste architecturen) */
pid_t si_pid; /* proces ID van de zender*/
uid_t si_uid; /* Huidig UID van zendende proces */
int si_status; /* Exit waarde of signaal */
clock_t si_utime; /* Gebruikte User tijd */
clock_t si_stime; /* Gebruikte Systeem tijd */
union sigval si_value; /* Signaal waarde */
int si_int; /* POSIX.1b signal */
void *si_ptr; /* POSIX.1b signal */
int si_overrun; /* Timer overrun teller;
POSIX.1b timers */
int si_timerid; /* Timer ID; POSIX.1b timers */
void *si_addr; /* Geheugen locatie die fout veroorzaakte */
long si_band; /* Band gebeurtenis (was int in
glibc 2.3.2 en eerder) */
int si_fd; /* Bestandsindicator */
short si_addr_lsb; /* Minst significant bit van adres
(vanaf Linux 2.6.32) */
void *si_lower; /* Laagste grens bij adres schending
occurred (vanaf Linux 3.19) */
void *si_upper; /* Hoogste grens bij adres schending
occurred (vanaf Linux 3.19) */
int si_pkey; /* Beveiliging sleutel op PTE die fout
veroorzaakte (vanaf Linux 4.6) */
void *si_call_addr; /* Addres van de systeem aanroep instructie
(vanaf Linux 3.5) */
int si_syscall; /* Aantal geprobeerde systeem aanroepen
(vanaf Linux 3.5) */
unsigned int si_arch; /* Architecture van geprobeerde systeem aanroep
(vanaf Linux 3.5) */
}
si_signo, si_errno en si_code zijn gedefinieerd voor alle signalen. (si_errno wordt in het algemeen niet
gebruikt op Linux.) De rest van de structure mag een union zijn, zodat men alleen die velden moet lezen
die van betekenis zijn voor het gegeven signaal:
• Signalen verzonden met kill(2) en sigqueue(3) vullen si_pid ensi_uid in. Daarnaast vullen signalen
verzonden met sigqueue(3) si_int en si_ptr in met de waarden opgegeven door de afzender van het
signaal; zie sigqueue(3) voor meer details.
• Signalen verzonden door POSIX.1b timers (vanaf Linux 2.6) vullen si_overrun en si_timerid in. Het
si_timerid veld is een intern ID dat gebruikt wordt door de kernel om de timer te identificeren; dit
is niet dezelfde als de timer ID die geretourneerd wordt door timer_create(2). Het si_overrun veld is
de overloop teler; dit is dezelfde informatie die wordt verkregen door een aanroep van
timer_getoverrun(2). Deze velden zijn niet standaard Linux uitbreidingen.
• Signalen verzonden voor berichten rij notificatie (zie de beschrijving van SIGEV_SIGNAL in
mq_notify(3)) vul si_int/si_ptr in, met de sigev_value geleverd aan mq_notify(3); si_pid, met de
proces ID van de berichten afzender; en si_uid, met het echte gebruiker ID van de berichten afzender.
• SIGCHLD vult si_pid, si_uid, si_status, si_utime en si_stime in, informatie gevend over het kind. Het
si_pid veld is het proces ID van het kind; si_uid is het echte gebruikers ID van het kind. Het
si_status veld bevat de eind status van het kind (als si_code gelijk is aan CLD_EXITED) of het
signaal nummer dat de status verandering van het proces veroorzaakte. De si_utime en si_stime
bevatten het gebruiker- en systeem CPU tijd gebruikt door het kind proces; deze velden bevatten niet
de tijden gebruikt door het wachten-op kinderen (anders dan getrusage(2) en times(2)). In kernels tot
en met Linux 2.6 en vanaf Linux 2.6.27 rapporteren deze velden CPU tijd in eenheden van
sysconf(_SC_CLK_TCK). In Linux 2.6 kernels voor Linux 2.6.27 zorgde een bug ervoor dat deze velden
tijden rapporteerde in eenheden van de (configureerbare) systeem jiffy (zie time(7)).
• SIGILL, SIGFPE, SIGSEGV, SIGBUS, en SIGTRAP vullensi_addr in met het adres van de fout. Op sommige
architecturen, vullen deze signalen ook het si_trapno veld in.
Sommige sub-fouten van SIGBUS, in het bijzonder BUS_MCEERR_AO en BUS_MCEERR_AR, vullen ook si_addr_lsb
in. Dit veld geeft het minst significante bit aan van het gerapporteerde adres en daarmee de omvang
van de corruptie. Bij voorbeeld als een complete pagina werd gecorrumpeerd van bevat si_addr_lsb
log2(sysconf(_SC_PAGESIZE)). Wanneer SIGTRAP werd afgeleverd als antwoord op een ptrace(2) gebeurtenis
(PTRACE_EVENT_foo) dan wordt si_addr niet beschreven, maar worden si_pid en si_uid beschreven met
respectievelijk het proces ID en gebruikers ID verantwoordelijk voor het leveren van de valkuil. In
het geval van seccomp(2) zal de gevolgde die de gebeurtenis geleverd heeft worden getoond.
BUS_MCEERR_* en si_addr_lsb zijn Linux-specifieke uitbreidingen.
De SEGV_BNDERR sub-fout van SIGSEGV vult si_lower en si_upper.
De SEGV_PKUERR sub-fout van SIGSEGV vult si_pkey.
• SIGIO/SIGPOLL (de twee namen zijn synoniemen op Linux) vullen si_band en si_fd in. De si_band
gebeurtenis is een bit masker dat dezelfde waarden bevat zoals ingevuld in het revents veld door
poll(2). Het si_fd veld geeft de bestandsindicator voor welke de Invoer/Uitvoer gebeurtenis optrad;
zie voor verdere details de beschrijving van F_SETSIG in fcntl(2).
• SIGSYS wordt gegenereerd (vanaf Linux 3.5) zodra een seccomp filter SECCOMP_RET_TRAP terugkeert, en
vult si_call_addr, si_syscall, si_arch, si_errno in, en andere velden zoals beschreven in seccomp(2).
Het si_code veld
Het si_code veld in het siginfo_t argument, dat wordt doorgegeven naar een SA_SIGINFO signaal
afhandelaar, is een waarde (geen bit masker) die aangeeft waarom dit signaal werd verstuurd. Voor een
ptrace(2) gebeurtenis zal si_code SIGTRAP bevatten en heeft een ptrace gebeurtenis in het hoge byte:
(SIGTRAP | PTRACE_EVENT_foo << 8).
Voor een niet-ptrace gebeurtenis, worden de waarden die kunnen verschijnen in si_code beschreven in het
vervolg van deze sectie. Vanaf glibc 2.20 worden de definities van de meeste symbolen verkregen uit
<signal.h> door het definiëren van feature test macro´s (vóór het invoegen van enig header bestand) als
volgt:
• _XOPEN_SOURCE met een waarde van 500 of groter;
• _XOPEN_SOURCE en _XOPEN_SOURCE_EXTENDED; of
• _POSIX_C_SOURCE met een waarde van 200809L of groter.
Voor de TRAP_* constanten worden de symbool definities alleen in de eerste twee gevallen voorzien. Voor
glibc 2.20 werden geen feature test macro´s vereist om deze symbolen te verkrijgen.
Voor een regulier signaal toont de volgende lijst de waarden die kunnen worden geplaatst in si_code voor
elk signaal, samen met de reden waarom dat signaal werd gegenereerd.
SI_USER
kill(2).
SI_KERNEL
Verzonden door de kernel.
SI_QUEUE
sigqueue(3).
SI_TIMER
POSIX timer liep af.
SI_MESGQ (sinds Linux 2.6.6)
POSIX berichten rij toestand veranderde; zie mq_notify(3).
SI_ASYNCIO
AIO voltooid.
SI_SIGIO
SIGIO in wachtrij (tot en met Linux 2.2; vanaf Linux 2.4 vult SIGIO/SIGPOLL si_code in zoals
hieronder beschreven).
SI_TKILL (vanaf Linux 2.4.19)
tkill(2) of tgkill(2).
De volgende waarden kunnen worden geplaatst in si_code voor een SIGILL signaal:
ILL_ILLOPC
Ongeldige opcode.
ILL_ILLOPN
Ongeldige operand.
ILL_ILLADR
Ongeldige adresseer "mode".
ILL_ILLTRP
Ongeldige valkuil.
ILL_PRVOPC
Geprivilegieerde opcode.
ILL_PRVREG
Geprivilegieerd register.
ILL_COPROC
Hulpprocessor fout.
ILL_BADSTK
Inwendige stapel fout.
De volgende waarden kunnen worden geplaatst in si_code voor een SIGFPE signaal:
FPE_INTDIV
Geheel getal delen door nul.
FPE_INTOVF
Geheel getal overloop.
FPE_FLTDIV
Drijvende komma deel door nul.
FPE_FLTOVF
Drijvende komma overloop.
FPE_FLTUND
Drijvende komma onderloop.
FPE_FLTRES
Drijvende komma onprecies antwoord.
FPE_FLTINV
Drijvende komma ongeldige operatie.
FPE_FLTSUB
Index buiten bereik.
De volgende waarden kunnen worden geplaatst in si_code voor een SIGSEGV signaal:
SEGV_MAPERR
Adres niet verbonden met object.
SEGV_ACCERR
Ongeldige toestemmingen voor "mapped" object.
SEGV_BNDERR (sinds Linux 3.19)
Gefaalde adresgrenzen controles.
SEGV_PKUERR (sinds Linux 4.6)
Toegang werd geweigerd voor geheugen bescherming sleutels. Zie pkeys(7). de bescherming
sleutel die van toepassing was op deze toegang is beschikbaar via si_pkey.
De volgende waarden kunnen worden geplaatst in si_code voor een SIGBUS signaal:
BUS_ADRALN
Ongeldige adres oplijning.
BUS_ADRERR
Niet bestaand fysiek adres.
BUS_OBJERR
Object-eigen "hardware" fout.
BUS_MCEERR_AR (sinds Linux 2.6.32)
Hardware geheugen fout verwerkt bij een machine controle; actie vereist.
BUS_MCEERR_AO (sinds Linux 2.6.32)
Hardware geheugen fout gedetecteerd in een proces maar niet verwerkt; actie is optioneel.
De volgende waarden kunnen worden geplaatst in si_code voor een SIGTRAP signaal:
TRAP_BRKPT
Proces breekpunt.
TRAP_TRACE
Proces volgpunt valkuil.
TRAP_BRANCH (vanaf Linux 2.4, IA64 only)
Genomen proces aftak valkuil.
TRAP_HWBKPT (vanaf Linux 2.4, IA64 only)
Hardware breekpunt/watchpoint.
De volgende waarden kunnen worden geplaatste in si_code voor een SIGCHLD signaal:
CLD_EXITED
Kind is beëindigd.
CLD_KILLED
Kind was vermoord.
CLD_DUMPED
Kind eindigde abnormaal.
CLD_TRAPPED
Gevolgd kind viel in valkuil.
CLD_STOPPED
Kind is gestopt.
CLD_CONTINUED (sinds Linux 2.6.9)
Gestopt kind is doorgegaan.
De volgende waarden kunnen worden gezet in si_code voor een SIGIO/SIGPOLL signaal:
POLL_IN
Gegevens invoer beschikbaar.
POLL_OUT
Uitvoer buffers beschikbaar.
POLL_MSG
Invoer bericht beschikbaar.
POLL_ERR
In/uit fout.
POLL_PRI
Hoge prioriteit invoer beschikbaar.
POLL_HUP
Apparaat los gemaakt.
De volgende waarde kan worden geplaatst in si_code voor een SIGSYS signaal:
SYS_SECCOMP (sinds Linux 3.5)
Getriggerd door een seccomp(2) filter regel
Dynamisch polsen op vlag bit ondersteuning
De sigaction() aanroep in Linux accepteert onbekende bits gezet in act->sa_flags zonder een fout. Het
gedrag van de kernel vanaf Linux 5.11 is dat een tweede sigaction() onbekende bits in oudeact->sa_flags
zal wissen. Echter, historisch, zou een tweede sigaction() aanroep deze bits typisch gezet laten in
oudeact->sa_flags.
Dit betekent dat ondersteuning van nieuwe vlaggen niet kan worden gedetecteerd door het eenvoudigweg
testen van vlaggen in sa_flags, en een programma moet testen dat SA_UNSUPPORTED gewist werd voordat het
kan vertrouwen op de inhoud van sa_flags.
Omdat het gedrag van de signaal afhandelaar niet kan worden gegarandeerd behalve als de test slaagt, is
het slim om ofwel het betrokken signaal te blokkeren terwijl de afhandelaar geregistreerd wordt en in
geval de controle uit te voeren, ofwel indien dit niet mogelijk is, bijvoorbeeld als het signaal
synchroon is, om een tweede sigaction() te maken in de signaal afhandelaar zelf.
In kernels die geen specifieke vlag ondersteunen, gedraagt de kernel zich alsof deze vlag niet werd
gezet, zelfs als de vlag werd gezet in act->sa_flags.
De vlaggen SA_NOCLDSTOP, SA_NOCLDWAIT, SA_SIGINFO, SA_ONSTACK, SA_RESTART, SA_NODEFER, SA_RESETHAND, en
indien gedefinieerd door dearchitectuur, SA_RESTORER mogen niet betrouwbaar getest worden om dit
mechanisme te gebruiken, omdat ze geïntroduceerd werden voor Linux 5.11. Echter programma´s mogen er in
het algemeen vanuit gaan dat deze vlaggen ondersteund worden, omdat ze allen ondersteund werden vanaf
Linux 2.6, dat werd vrijgegeven in het jaar 2003.
Zie VOORBEELDEN hieronder voor de demonstratie van het gebruik van SA_UNSUPPORTED.
EIND WAARDE
Bij succes geeft sigaction() nul terug. Bij falen wordt -1 teruggegeven en wordt errno naar behoren
gezet.
FOUTEN
EFAULT act of oudeact wijzen naar geheugen dat niet een geldig onderdeel van de proces adres ruimte is.
EINVAL Een ongeldig signaal werd opgegeven. Dit zal ook voortgebracht worden als een poging wordt gedaan
om de actie voor SIGKILL of SIGSTOP te veranderen, die niet gevangen kunnen worden.
VOLDOET AAN
POSIX.1-2001, POSIX.1-2008, SVr4.
OPMERKINGEN
Een kind aangemaakt met fork(2) erft een kopie van de signaal dispositie van zijn ouder. Tijdens een
execcve(2) worden de disposities van de afgehandelde signalen terug gezet naar de standaard; de
dispositie van de genegeerde signalen blijft onveranderd.
Volgens POSIX is het gedrag van een proces ongedefinieerd als het een SIGFPE, SIGILL of SIGSEGV negeert
dat niet voortgebracht werd door de kill() of de raise() functies. Heel getal delen door nul heeft
ongedefinieerd gevolg. Op sommige architecturen zal het een SIGFPE signaal veroorzaken. (Ook het delen
van het meest negatieve hele getal door -1 kan een SIGFPE veroorzaken.) Negeren van dit signaal zou tot
een eindeloze lus kunnen leiden.
POSIX.1-1990 stond niet toe om de actie voor SIGCHLD op SIG_IGN te zetten. POSIX.1-2001 en later stond
dit toe, zodat het negeren van SIGCHLD kan worden gebruikt om zombies aan te maken (zie wait(2)).
Desalniettemin verschillen de historische BSD en System V gedragingen voor negeren van SIGCHLD, daarom
is de enige compleet overdraagbare methode om te voorkomen dat beëindigde kinderen zombies worden om
signaal SIGCHLD op te vangen en het uitvoeren van een wait(2) of vergelijkbaar.
POSIX.1-1990 specificeerde alleen SA_NOCLDSTOP. POSIX.1-2001 voegde SA_NOCLDSTOP, SA_NOCLDWAIT,
SA_NODEFER, SA_ONSTACK, SA_RESETHAND, SA_RESTART, en SA_SIGINFO toe. Het gebruik van de laatste waarden
in sa_flagsis mogelijk minder overdraagbaar in applicaties die bedoeld zijn voor oudere UNIX
implementaties.
De SA_RESETHAND vlag is overdraagbaar met de SVr4 vlag met dezelfde naam.
De SA_NODEFER vlag is compatibel met de SVr4 vlag met dezelfde naam onder kernels 1.3.9 en nieuwer. Op
oudere kernels liet de Linux-implementatie het ontvangen van elk signaal toe, niet alleen dat dat we
installeren (daarbij de sa_mask instelling overschrijvend).
sigaction() kan aangeroepen worden met een tweede argument nul om de huidige signaalbehandelaar te
ondervragen. Het kan ook gebruikt worden om te testen of een gegeven signaal geldig is voor de huidige
machine, door het aan te roepen met 'nul' tweede en derde argumenten.
Het is niet mogelijk om SIGKILL of SIGSTOP te blokkeren door opgeven in sa_mask. Pogingen om dat te doen
zullen stilzwijgend genegeerd worden.
Ze sigsetops(3) voor details hoe signaal verzamelingen te manipuleren.
Zie signal-safety(7) voor een lijst van de async-signal-safe functies die veilig gebruikt kunnen worden
binnen een signaal afhandelaar.
C library/kernel verschillen
De glibc omwikkel functie voor sigaction() meldt een fout (EINVAL) bij pogingen om de dispositie te
veranderen van de twee realtime signalen die intern worden gebruikt door de NPTL threading implementatie.
Zie nptl(7) voor details.
Op architecturen waar de signaal trampoline zich in de C bibliotheek bevindt, plaatst de glibc omwikkel
functie voor sigaction() het adres van de trampoline code in het act.sa_restorer veld en zet de
SA_RESTORER vlag in het act.sa_flags veld. Zie sigreturn(2).
De originele Linux systeem aanroep was sigaction(). Echter met het toevoegen van realtime signalen in
Linux 2.2 was het vaste-grootte 32-bit sigset_t type ondersteund door die systeem aanroep niet meer
geschikt voor dit doel. Daarom werd de nieuwe systeem aanroep rt_sigaction() toegevoegd om een groter
sigset_t type te ondersteunen. De nieuwe systeem aanroep benodigd een vierde argument, size_t
sigsetsize, die de grootte in bytes bepaald van de signaal verzamelingen in act.sa_mask en
oudeact.sa_mask. Dit argument vereist momenteel de waarde sizeof(sigset_t) (of de fout EINVAL waarde). De
glibc sigaction() omwikkel functie verbergt deze details voor ons, door transparant rt_sigaction() aan te
roepen wanneer de kernel daarin voorziet.
Niet gedocumenteerd
Voor de introductie van SA_SIGINFO, was het ook mogelijk om enige additionele informatie over het signaal
te verkrijgen. Dit werd gedaan door het voorzien een sa_handler signaal afhandelaar met een tweede
argument van het type struct sigcontext, hetgeen dezelfde structure is als die die wordt doorgegeven in
het uc_mcontext veld van de ucontext structure die wordt doorgegeven (via een wijzer) in het derde
argument van de sa_sigaction afhandelaar. Zie de relevante Linux kernel bronnen voor details. Dit gebruik
is nu overbodig.
BUGS
Tijdens het afleveren van een signaal met een SA_SIGINFO afhandelaar, voorziet de kernel niet altijd in
betekenisvolle waarden voor alle velden in de siginfo_t die relevant zijn voor dat signaal.
Tot en met Linux 2.6.13 voorkomt het opgeven van SA_NODEFER in sa_flags dat het afgeleverde signaal wordt
gemaskeerd tijdens het uitvoeren van de afhandelaar, maar ook voor de signalen opgegeven in sa_mask. Deze
bug werd opgelost in Linux 2.6.14.
VOORBEELDEN
Zie mprotect(2).
Het polsen van vlag ondersteuning.
Het volgende voorbeeld programma eindigt met status EXIT_SUCCESS als besloten werd om SA_EXPOSE_TAGBITS
te ondersteunen, en anders EXIT_FAILURE.
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
void
handler(int signo, siginfo_t *info, void *context)
{
struct sigaction oudeact;
if (sigaction(SIGSEGV, NULL, &oudeact) == -1 ||
(oudeact.sa_flags & SA_UNSUPPORTED) ||
!(oudeact.sa_flags & SA_EXPOSE_TAGBITS))
{
_exit(EXIT_FAILURE);
}
_exit(EXIT_SUCCESS);
}
int
main(void)
{
struct sigaction act = { 0 };
act.sa_flags = SA_SIGINFO | SA_UNSUPPORTED | SA_EXPOSE_TAGBITS;
act.sa_sigaction = &handler;
if (sigaction(SIGSEGV, &act, NULL) == -1) {
perror("sigaction");
exit(EXIT_FAILURE);
}
raise(SIGSEGV);
}
ZIE OOK
kill(1), kill(2), pause(2), pidfd_send_signal(2), restart_syscall(2), seccomp(2), sigaltstack(2),
signal(2), signalfd(2), sigpending(2), sigprocmask(2), sigreturn(2), sigsuspend(2), wait(2), killpg(3),
raise(3), siginterrupt(3), sigqueue(3), sigsetops(3), sigvec(3), core(5), signal(7)
VERTALING
De Nederlandse vertaling van deze handleiding is geschreven door Jos Boersema <joshb@xs4all.nl>, Mario
Blättermann <mario.blaettermann@gmail.com> en Luc Castermans <luc.castermans@gmail.com>
Deze vertaling is vrije documentatie; lees de GNU General Public License Version 3 of later over de
Copyright-voorwaarden. Er is geen AANSPRAKELIJKHEID.
Indien U fouten in de vertaling van deze handleiding zou vinden, stuur een e-mail naar debian-l10n-
dutch@lists.debian.org.
Linux man-pagina's 6.03 10 februari 2023 sigaction(2)