sigaction(2)

NAAM
sigaction, rt_sigaction - onderzoek en verander een signaal actie

BIBLIOTHEEK
Standaard C bibliotheek (libc, -lc)

SAMENVATTING
#include <signal.h>

int sigaction(int signum, const struct sigaction *restrict act,
              struct sigaction *_NULL_baar restrict oudeact);

    Feature Test Macro Requirements voor 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;     /* Signal number */
        int      si_errno;     /* An errno value */
        int      si_code;      /* Signal code */
        int      si_trapno;    /* Trap number that caused
                                  hardware-generated signal
                                  (unused on most architectures) */
        pid_t    si_pid;       /* Sending process ID */
        uid_t    si_uid;       /* Real user ID of sending process */
        int      si_status;    /* Exit value or signal */
        clock_t  si_utime;     /* User time consumed */
        clock_t  si_stime;     /* System time consumed */
        union sigval si_value; /* Signal value */
        int      si_int;       /* POSIX.1b signal */
        void    *si_ptr;       /* POSIX.1b signal */
        int      si_overrun;   /* Timer overrun count;
                                  POSIX.1b timers */
        int      si_timerid;   /* Timer ID; POSIX.1b timers */
        void    *si_addr;      /* Memory location which caused fault */
        long     si_band;      /* Band event (was int in
                                  glibc 2.3.2 and earlier) */
        int      si_fd;        /* File descriptor */
        short    si_addr_lsb;  /* Least significant bit of address
                                  (since Linux 2.6.32) */
        void    *si_lower;     /* Lower bound when address violation
                                  occurred (since Linux 3.19) */
        void    *si_upper;     /* Upper bound when address violation
                                  occurred (since Linux 3.19) */
        int      si_pkey;      /* Protection key on PTE that caused
                                  fault (since Linux 4.6) */
        void    *si_call_addr; /* Address of system call instruction
                                  (since Linux 3.5) */
        int      si_syscall;   /* Number of attempted system call
                                  (since Linux 3.5) */
        unsigned int si_arch;  /* Architecture of attempted system call
                                  (since 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, of setitimer(2) of alarm(2) 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).

    SI_ASYNCNL
        Async name lookup completion.

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.

    FPE_FLTUNK (since Linux 4.17)
        Undiagnosed floating-point exception.

    FPE_CONDTRAP (PARISC only)
        Trap on condition.

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.

    SEGV_ACCADI (since Linux 4.17; SPARC only)
        Application Data Integrity not enabled for mapped object.

    SEGV_ADIDERR (since Linux 4.17; SPARC only)
        Disrupting Memory Corruption Detection error.

    SEGV_ADIPERR (since Linux 4.17; SPARC only)
        Precise Memory Corruption Detection exception.

    SEGV_MTEAERR (since Linux 5.10; ARM only)
        Asynchronous Memory Tagging Extension error.

    SEGV_MTESERR (since Linux 5.10; ARM only)
        Synchronous Memory Tagging Extension exception.

    SEGV_CPERR (since Linux 6.10)
        Control protection fault.

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 (since Linux 2.4; IA64 only)
        Genomen proces aftak valkuil.

    TRAP_HWBKPT (since Linux 2.4; IA64 only)
        Hardware breekpunt/watchpoint.

    TRAP_UNK (since Linux 4.18)
        Undiagnosed trap.

    TRAP_PERF (since Linux 5.13 and glibc 2.43)
        Perf event with sigtrap=1.

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.

The following values can be placed in si_code for a SIGSYS signal:

    SYS_SECCOMP (since Linux 3.5 and glibc 2.43)
        Getriggerd door een seccomp(2) filter regel

    SYS_USER_DISPATCH (since Linux 5.11 and glibc 2.43)
        Syscall user dispatch triggered.

The following value can be placed in si_code for a SIGEMT signal:

    EMT_TAGOVF (SPARC only)
        Tag overflow.

  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.

VERSIES

  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.

STANDAARDEN
POSIX.1-2024.

HISTORIE
POSIX.1-2001, SVr4.

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_NOCLDWAIT, SA_NODEFER, SA_ONSTACK, SA_RESETHAND, SA_RESTART, en SA_SIGINFO als XSI extensies toe. POSIX.1-2008 verplaatste SA_NODEFER, SA_RESETHAND, SA_RESTART, en SA_SIGINFO naar de basis specificatie. Gebruik van de laatste waarden in sa_flags is 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).

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.

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.

POSIX only guarantees SI_TIMER for signals created by timer_create(2). Implementations are free to also provide it for other types of timers. The Linux behavior matches NetBSD.

  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
Bij het afleveren van een signaal als resultaat van een hardware exceptie met een SA_SIGINFO afhandelaar, geeft de kernel niet altijd betekenis volle waarden voor alle velden in siginfo_t die relevant zijn voor dat signaal. Bij voorbeeld als de x86 int instructie werd aangeroepen met een voorboden (elk getal anders dan 3 of 128), dan wordt het SIGSEGV afgegeven, maar het aan de signaal afhandelaar door gegeven siginfo_t veld heeft alle gezet op nul behalve si_signo en si_code , zelfs als andere velden gezet zouden moeten worden (bij voorbeeld si_addr zou niet-nul moeten zijn voor alle SIGSEGV signalen).

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>

    static void
    handler(int signo, siginfo_t *info, void *context)
    {
        struct sigaction oldact;

        if (sigaction(SIGSEGV, NULL, &oldact) == -1
            || (oldact.sa_flags & SA_UNSUPPORTED)
            || !(oldact.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 (https://www.gnu.org/licenses/gpl-3.0.html) 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.