sigaction(2)

NOM
sigaction, rt_sigaction - Examiner et modifier l'action associée à un signal

BIBLIOTHÈQUE
Bibliothèque C standard (libc, -lc)

SYNOPSIS
#include <signal.h>

int sigaction(int signum,
              const struct sigaction *_Nullable restrict act,
              struct sigaction *_Nullable restrict oldact);

    Exigences de macros de test de fonctionnalités pour la glibc (consulter feature_test_macros(7)) :

sigaction() :
    _POSIX_C_SOURCE

siginfo_t :
    _POSIX_C_SOURCE >= 199309L

DESCRIPTION
L'appel système sigaction() sert à modifier l'action effectuée par un processus à la réception d'un signal spécifique. (Consultez signal(7) pour une vue d'ensemble sur les signaux)

signum indique le signal concerné, à l'exception de SIGKILL et SIGSTOP.

Si act n'est pas NULL, la nouvelle action pour le signal signum est définie par act. Si oldact n'est pas NULL, l'ancienne action est sauvegardée dans oldact.

La structure sigaction est définie par quelque chose comme :

    struct sigaction {
        void     (*sa_handler)(int);
        void     (*sa_sigaction)(int, siginfo_t *, void *);
        sigset_t   sa_mask;
        int        sa_flags;
        void     (*sa_restorer)(void);
    };

Sur certaines architectures, on emploie une union. Il ne faut donc pas utiliser ou remplir simultanément sa_handler et sa_sigaction.

Le champ sa_restorer n'est pas conçu pour une utilisation dans une application (POSIX ne spécifie pas de champ sa_restorer). Vous pouvez trouver plus de détails sur l'objectif de ce champ dans sigreturn(2).

sa_handler indique l'action à associer à signum et il peut s'agir d'une des suivantes :

-   SIG_DFL pour l'action par défaut.

-   SIG_IGN pour ignorer ce signal.

-   Un pointeur vers une fonction de gestion de signal. Cette fonction reçoit le numéro du signal comme seul paramètre.

Si SA_SIGINFO est indiqué dans sa_flags, sa_sigaction (et non sa_handler) indique la fonction de gestion de signal dans signum. Cette fonction reçoit trois paramètres, comme décrit ci-dessous.

sa_mask spécifie un masque de signaux à bloquer (c'est-à-dire ajoutés au masque de signaux du thread dans lequel le gestionnaire est appelé) pendant l'exécution du gestionnaire. De plus le signal ayant appelé le gestionnaire est bloqué à moins que l'attribut SA_NODEFER soit précisé.

sa_flags spécifie un ensemble d'attributs qui modifient le comportement du signal. Il est formé par un OU binaire « | ») entre les options suivantes :

SA_NOCLDSTOP
    Si signum vaut SIGCHLD, ne pas recevoir les signaux de notification d'arrêt (quand l'enfant reçoit un signal SIGSTOP, SIGTSTP, SIGTTIN ou SIGTTOU) ou de relance (quand il reçoit SIGCONT) des processus enfant. Consultez wait(2). Cet attribut n'a de sens que lors de la mise en place d'un gestionnaire pour SIGCHLD.

SA_NOCLDWAIT (depuis Linux 2.6)
    Si signum vaut SIGCHLD, ne pas transformer les enfants en zombies lorsqu'ils se terminent. Consultez aussi waitpid(2). Cet attribut n'a de sens que lors de la mise en place d'un gestionnaire pour SIGCHLD, ou lors de la configuration de la disposition de signal de SIG_DFL.

    Si l'attribut SA_NOCLDWAIT est défini lors de la mise en place d'un gestionnaire pour SIGCHLD, POSIX.1 ne spécifie pas si le signal SIGCHLD est généré lorsqu'un processus enfant se termine. Sous Linux, un signal SIGCHLD est généré dans ce cas ; sur d'autres implémentations, il ne l'est pas.

SA_NODEFER
    Ne pas ajouter le signal au masque de signal du thread pendant l'exéution du gestionnaire, sauf si le signal est indiqué dans act.sa_mask. Par conséquent, une prochaine instance du signal pourra être délivrée au thread pendant qu'il exécute le gestionnaire. Ce drapeau n'a de sens que lorsqu'on met en place un gestionnaire de signal.

    SA_NOMASK est un synonyme obsolète et non standard de ce drapeau.

SA_ONSTACK
    Appeler le gestionnaire avec une pile différente fournie par sigaltstack(2). Si cette pile est indisponible, on utilisera la pile par défaut. Cet attribut n'a de sens que lors de la mise en place d'un gestionnaire de signal.

SA_RESETHAND
    Rétablir l'action à son comportement par défaut à l'entrée dans le gestionnaire de signal. Cet attribut n'a de sens que lors de la mise en place d'un gestionnaire de signal.

    SA_ONESHOT est un synonyme obsolète et non standard de ce drapeau.

SA_RESTART
    Fournir un comportement compatible avec la sémantique BSD en redémarrant automatiquement les appels système lents interrompus par l'arrivée du signal. Cet attribut n'a de sens que lors de la mise en place d'un gestionnaire de signal. Consultez signal(7) pour une discussion sur le redémarrage d'un appel système.

SA_RESTORER
    N'est pas conçu pour être utilisé dans une application. Ce drapeau est utilisé par les bibliothèques C pour indiquer que le champ sa_restorer contient l'adresse d'un « trampoline de signal ». Consultez sigreturn(2) pour plus de détails.

SA_SIGINFO (depuis Linux 2.2)
    Le gestionnaire de signal recevra trois arguments, et non plus un seul. Dans ce cas, il faut utiliser le membre sa_sigaction au lieu de sa_handler. Cet attribut n'a de sens que lors de la mise en place d'un gestionnaire de signal.

SA_UNSUPPORTED (depuis Linux 5.11)
    Utilisé pour sonder de manière dynamique la prise en charge des bits de drapeau.

    Si un essai d'enregistrement de gestionnaire réussit alors que ce drapeau est positionné sur act->sa_flags parmi d'autres drapeaux potentiellement non pris en charge par le noyau, et si un appel sigaction() immédiatement consécutif indiquant un numéro de signal et ayant un paramètre oldact non NULL aboutit à un clear SA_UNSUPPORTED dans oldact->sa_flags, oldact->sa_flags peut être utilisé comme masque de bit décrivant les drapeaux potentiellement non pris en charge qui sont en réalité gérés. Consultez la section « Sonder dynamiquement la prise en charge de bits de drapeau » ci-dessous pour plus de détails.

SA_EXPOSE_TAGBITS (depuis Linux 5.11)
    Normalement, lorsqu'un signal est délivré, un jeu de bits d'étiquettes spécifique à l'architecture est vidé depuis le champ si_addr de siginfo_t. Si ce drapeau est positionné, un sous-ensemble de bits d'étiquette spécifique à l'architecture sera conservé dans si_addr.

    Les programmes qui doivent être compatibles avec des versions de Linux supérieures à la 5.11 doivent utiliser SA_UNSUPPORTED pour tester la prise en charge.

  Le paramètre siginfo_t vers un gestionnaire SA_SIGINFO
Quand le drapeau SA_SIGINFO est indiqué à act.sa_flags, l'adresse du gestionnaire de signal est passée à l'aide du champ act.sa_sigaction. Ce gestionnaire prend trois paramètres comme suit :

    void
    handler(int sig, siginfo_t *info, void *ucontext)
    {
        ...
    }

Ces trois paramètres sont comme suit

sig Le numéro de signal qui a provoqué l'appel du gestionnaire.

info
    Un pointeur vers un siginfo_t, qui est une structure contenant plus d'informations sur le signal comme décrit ci-dessous.

ucontext
    Il s'agit d'un pointeur vers une structure ucontext_t, diffusée sur void\ *. La structure vers laquelle pointe ce champ contient des informations contextuelles sur le signal sauvegardées dans la pile de l'espace utilisateur par le noyau ; pour des détails, consultez sigreturn(2). Vous pouvez trouver plus d'informations sur la structure ucontext_t dans getcontext(3) et signal(7). Généralement, la fonction de gestionnaire n'utilise pas le troisième paramètre.

Le type de données siginfo_t est une structure contenant les champs suivants :

    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 et si_code sont définis pour tous les signaux (si_errno n'est généralement pas utilisé sous Linux). Le reste de la structure peut être une union, de telle sorte qu'on puisse ne lire que les champs spécifiques à un signal donné :

-   Les signaux envoyés avec kill(2) et sigqueue(3) remplissent si_pid et si_uid. De plus, les signaux envoyés avec sigqueue(3) remplissent si_int et si_ptr avec les valeurs indiquées par l'émetteur du signal ; consultez sigqueue(3) pour plus de détails.

-   Les signaux envoyés par les horloges POSIX.1b (depuis Linux 2.6) remplissent si_overrun et si_timerid. Le champ si_timerid est un identifiant interne utilisé par le noyau pour identifier l'horloge ; ce n'est pas la même chose que l'identifient d'horloge renvoyé par timer_create(2). Le champ si_overrun est le compteur de dépassement de l'horloge ; il s'agit de la même information renvoyée par un appel à timer_getoverrun(2). Ces champs sont des extensions Linux non standard.

-   Les signaux envoyés pour les notifications de files de messages (voyez la description de SIGEV_SIGNAL dans mq_notify(3)) remplissent si_int/si_ptr avec la valeur sigev_value fournie à mq_notify(3) ; si_pid avec l'identifiant du processus de l'émetteur du message ; et si_uid avec l'identifiant d'utilisateur réel de l'émetteur du message.

-   SIGCHLD remplit si_pid, si_uid, si_status, si_utime et si_stime, pour fournir des informations au sujet des enfants. Le champ si_pid est l'identifiant de processus de l'enfant ; si_uid est l'identifiant d'utilisateur réel de l'enfant. Le champ si_status contient le code de sortie de l'enfant (si si_code vaut CLD_EXITED), ou le numéro du signal qui a changé l'etat du processus. Les champs si_utime et si_stime comprennent les temps utilisateur et système utilisé par le processus enfant ; ces champs ne comprennent pas le temps utilisé par les enfants lorsqu'ils sont attendus (au contraire de getrusage(2) et times(2)). Jusqu'à Linux 2.6, et depuis Linux 2.6.27, ces champs renvoient le temps CPU en unité de sysconf(_SC_CLK_TCK). Dans les noyaux Linux 2.6, avant Linux 2.6.27, un bogue faisait que ces champs renvoyaient des temps mesurés en jiffy système (configurable) (consultez time(7)).

-   SIGILL, SIGFPE, SIGSEGV, SIGBUS et SIGTRAP remplissent si_addr avec l'adresse de l'erreur. Sur certaines architectures, ces signaux remplissent aussi le champ si_trapno.

    Certaines sous-erreurs de SIGBUS, en particulier BUS_MCEERR_AO et BUS_MCEERR_AR, remplissent également si_addr_lsb. Ce champ indique le bit le moins significatif de l'adresse signalée et, donc, l'étendue de la corruption. Par exemple, si toute une page est corrompue, si_addr_lsb contient log2(sysconf(_SC_PAGESIZE)). Lorsque SIGTRAP est délivré en réponse à un événement ptrace(2) ((PTRACE_EVENT_foo), si_addr n'est pas peuplé mais si_pid et si_uid le sont avec leur identifiant de processus et d'utilisateur respectifs responsables de cette trappe. Dans le cas de seccomp(2), le traceur sera affiché comme délivrant un événement. BUS_MCEERR_* et si_addr_lsb sont des extensions spécifiques à Linux.

    La sous-erreur de SEGV_BNDERR de SIGSEGV peuple si_lower et si_upper.

    La sous-erreur SEGV_PKUERR de SIGSEGV peuple si_pkey.

-   SIGPOLL/SIGIO (synonymes sous Linux) remplissent si_band et si_fd. L'événement si_band est un masque de bits contenant les mêmes valeurs que celles qui sont remplies dans le champ revents par poll(2). Le champ si_fd donne le descripteur de fichiers sur lequel l'événement d'entrées-sorties s'est produit. Pour plus de détails, voir la description de F_SETSIG dans fcntl(2).

-   SIGSYS, généré (depuis Linux 3.5) quand un filtre seccomp renvoie SECCOMP_RET_TRAP, remplit si_call_addr, si_syscall, si_arch, si_errno et d'autres décrits dans seccomp(2).

  Le champ si_code
Le champ si_code du paramètre siginfo_t passé à un gestionnaire de signal SA_SIGINFO est une valeur (et non un masque de bit) indiquant la raison de l'envoi de ce signal. Pour un événement ptrace(2), si_code contiendra SIGTRAP et aura l'événement ptrace dans l'octet fort :

    (SIGTRAP | PTRACE_EVENT_foo << 8).

Pour un événement non ptrace(2), les valeurs qui peuvent apparaître dans si_code sont décrites dans le reste de cette section. Depuis la glibc 2.20, les définitions de la plupart de ces symboles viennent de <signal.h> en définissant des macros de test de fonctionnalités (avant l'inclusion de tout fichier d'en-tête) comme suit :

-   _XOPEN_SOURCE avec la valeur 500 ou supérieure ;

-   _XOPEN_SOURCE et _XOPEN_SOURCE_EXTENDED ; ou

-   _POSIX_C_SOURCE avec la valeur 200809L ou supérieure.

Pour les constantes TRAP_*, les définitions de symboles ne sont fournies que dans les deux premiers cas. Avant la glibc 2.20, aucune macro de test n'était nécessaire pour obtenir ces symboles.

Pour un signal normal, la liste suivante indique les valeurs que peut prendre si_code pour n'importe quel signal, avec la raison associée.

    SI_USER
        kill(2).

    SI_KERNEL
        Envoyé par le noyau.

    SI_QUEUE
        sigqueue(3).

    SI_TIMER
        POSIX, or setitimer(2) or alarm(2) timer expired.

    SI_MESGQ (depuis Linux 2.6.6)
        Changement d'état d'une file de messages ; voir mq_notify(3).

    SI_ASYNCIO
        Fin d'une AIO.

    SI_SIGIO
        SIGIO avec file d'attente (seulement jusqu'à Linux 2.2 ; à partir de Linux 2.4, SIGIO/SIGPOLL remplit si_code de la façon décrite plus bas).

    SI_TKILL (depuis Linux 2.4.19)
        tkill(2) ou tgkill(2).

    SI_ASYNCNL
        Async name lookup completion.

Les valeurs suivantes peuvent être prises par si_code pour un signal SIGILL :

    ILL_ILLOPC
        opcode illégal.

    ILL_ILLOPN
        opérande illégale.

    ILL_ILLADR
        Mode d'adressage illégal.

    ILL_ILLTRP
        Trappe illégale.

    ILL_PRVOPC
        Opcode privilégié.

    ILL_PRVREG
        Registre privilégié.

    ILL_COPROC
        Erreur de coprocesseur.

    ILL_BADSTK
        erreur interne de pile.

Les valeurs suivantes peuvent être prises par si_code pour un signal SIGFPE :

    FPE_INTDIV
        division entière par zéro.

    FPE_INTOVF
        débordement entier.

    FPE_FLTDIV
        division flottante par zéro.

    FPE_FLTOVF
        débordement flottant.

    FPE_FLTUND
        débordement inférieur flottant.

    FPE_FLTRES
        résultat flottant inexact.

    FPE_FLTINV
        opération flottante invalide.

    FPE_FLTSUB
        indice hors intervalle.

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

    FPE_CONDTRAP (PARISC only)
        Trap on condition.

Les valeurs suivantes peuvent être prises par si_code pour un signal SIGSEGV :

    SEGV_MAPERR
        adresse sans objet.

    SEGV_ACCERR
        permissions invalides pour l'objet.

    SEGV_BNDERR (depuis Linux 3.19)
        Vérification des limites de l'adresse échouée.

    SEGV_PKUERR (depuis Linux 4.6)
        Accès interdit par des clés de protection de la mémoire. Consultez pkeys(7). La clé de protection applicable à cet accès est disponible à l'aide de 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.

Les valeurs suivantes peuvent être prises par si_code pour un signal SIGBUS :

    BUS_ADRALN
        alignement d'adresse non valable.

    BUS_ADRERR
        adresse physique inexistante.

    BUS_OBJERR
        erreur matérielle spécifique.

    BUS_MCEERR_AR (depuis Linux 2.6.32)
        erreur mémoire matérielle consommée lors de vérification de la machine ; action requise.

    BUS_MCEERR_AO (depuis Linux 2.6.32)
        erreur mémoire matérielle détectée dans le processus mais non consommée ; action optionnelle.

Les valeurs suivantes peuvent être prises par si_code pour un signal SIGTRAP :

    TRAP_BRKPT
        point d'arrêt du processus.

    TRAP_TRACE
        trappe dans le suivi d'exécution du processus.

    TRAP_BRANCH (since Linux 2.4; IA64 only)
        trappe dans le suivi des branches prises par le processus.

    TRAP_HWBKPT (since Linux 2.4; IA64 only)
        point d'arrêt/point à surveiller matériels.

    TRAP_UNK (since Linux 4.18)
        Undiagnosed trap.

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

Les valeurs suivantes peuvent être prises par si_code pour un signal SIGCHLD :

    CLD_EXITED
        enfant terminé normalement.

    CLD_KILLED
        enfant tué par un signal.

    CLD_DUMPED
        enfant terminé anormalement.

    CLD_TRAPPED
        l'enfant en cours de suivi a une trappe.

    CLD_STOPPED
        L'enfant s'est arrêté.

    CLD_CONTINUED (depuis Linux 2.6.9)
        l'enfant arrêté a redémarré.

Les valeurs suivantes peuvent être prises par si_code pour un signal SIGIO/SIGPOLL :

    POLL_IN
        données disponibles en entrée.

    POLL_OUT
        tampons de sortie libres.

    POLL_MSG
        message disponible en entrée.

    POLL_ERR
        Erreur d'entrée-sortie.

    POLL_PRI
        entrée à haute priorité disponible.

    POLL_HUP
        périphérique débranché.

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

    SYS_SECCOMP (since Linux 3.5 and glibc 2.43)
        Différé par une règle de filtrage seccomp(2).

    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.

  Sondage dynamique de la prise en charge des bits de drapeau
L'appel sigaction() sur Linux accepte des jeux de bits inconnus act->sa_flags sans erreur. Le comportement du noyau, à partir de Linux 5.11, est qu'un deuxième sigaction(2) videra les bits inconnus de oldact->sa_flags. Toutefois, historiquement, un second appel sigaction() laissait généralement ces ensembles de bits dans oldact->sa_flags.

Cela signifie que la prise en charge de nouveaux drapeaux ne peut pas être détectée par un simple test du drapeau sa_flags dans sa_flags et un programme doit tester que SA_UNSUPPORTED a été vidé avant de s'appuyer sur le contenu de sa_flags.

Comme le comportement du gestionnaire ne peut pas être garanti, sauf si la vérification réussit, il vaut mieux soit bloquer le signal concerné tout en enregistrant le gestionnaire puis effectuer la vérification dans ce cas, soit, quand cela n'est pas possible, par exemple si le signal est synchrone, effectuer le deuxième sigaction() dans le gestionnaire de signal lui-même.

Dans les noyaux qui ne prennent pas en charge un drapeau en particulier, le comportement du noyau est le même que si le drapeau n'était pas positionné, même si ce dernier a été positionné avec act->sa_flags.

Les drapeaux SA_NOCLDSTOP, SA_NOCLDWAIT, SA_SIGINFO, SA_ONSTACK, SA_RESTART, SA_NODEFER, SA_RESETHAND et, s'il est défini par l'architecture, SA_RESTORER, peuvent ne pas être sondés de manière fiable si on utilise ce mécanisme, parce qu'ils ont été introduits avant Linux 5.11. Cependant, en général, les programmes peuvent supposer que ces drapeaux sont pris en charge car ils le sont depuis Linux 2.6, publié en 2003.

Consultez les EXEMPLES ci-dessous pour une démonstration de l'utilisation de SA_UNSUPPORTED.

VALEUR RENVOYÉE
sigaction() renvoie 0 s'il réussit. En cas d'erreur, -1 est renvoyé et errno contient le code d'erreur.

ERREURS

EFAULT
    act ou oldact pointent en-dehors de l'espace d'adressage accessible.

EINVAL
    Un signal non valable est indiqué. Cela se produit également si l'on tente de modifier l'action associée aux signaux SIGKILL ou SIGSTOP, qui ne peuvent pas être interceptés ou ignorés.

VERSIONS

  Différences entre bibliothèque C et noyau
La fonction enveloppe de la glibc autour de sigacttion() donne une erreur (EINVAL) lorsqu'on essaie de changer la position des deux signaux en temps réel utilisés en interne par l'implémentation de threading de NPTL. Consultez nptl(7) pour plus de détails.

Sur des architectures où le trampoline du signal se trouve dans la bibliothèque C, la fonction enveloppe de la bibliothèque C autour de sigaction() met l'adresse du code de trampoline dans le champ act.sa_restorer et positionne le drapeau SA_RESTORER du champ act.sa_flags. Consultez sigreturn(2).

L'appel système Linux d'origine s'appelait sigaction(). Toutefois, avec l'arrivée des signaux en temps réel dans Linux 2.2 et de la taille figée, le type sigset_t 32 bits pris en charge par cet appel système ne convenait plus à cet objectif. Par conséquent, un nouvel appel système rt_sigaction() a été ajouté pour prendre en charge le type sigset_t élargi. Le nouvel appel système prend un quatrième paramètre, size_t sigsetsize, qui indique la taille en octets des jeux de signal dans act.sa_mask et oldact.sa_mask. Ce paramètre est actuellement nécessaire pour obtenir la valeur sizeof(sigset_t) (ou le résultat de l'erreur EINVAL). La fonction enveloppe sigaction() de la glibc nous cache ces détails en appelant de manière transparente rt_sigaction() quand le noyau le fournit.

NORMES
POSIX.1-2024.

HISTORIQUE
POSIX.1-2001, SVr4.

POSIX.1-1990 interdisait de positionner SIGCHLD avec SIG_IGN. POSIX.1-2001 l'autorise, et ignorer SIGCHLD permet donc d'éviter la création de zombies (consultez wait(2)). Cependant, les comportements historiques de BSD et de System V quand SIGCHLD est ignoré diffèrent, si bien que la seule méthode complètement portable pour s'assurer que les enfants ne deviennent pas des zombies à leur terminaison est d'intercepter le signal SIGCHLD et d'invoquer wait(2) ou équivalent.

POSIX.1-1990 ne documentait que SA_NOCLDSTOP. POSIX.1-2001 a ajouté SA_NOCLDWAIT, SA_NODEFER, SA_ONSTACK, SA_RESETHAND, SA_RESTART et SA_SIGINFO comme extensions XSI. POSIX.1-2008 a déplacé SA_NODEFER, SA_RESETHAND, SA_RESTART et SA_SIGINFO dans les spécifications de base. L'utilisation de ces dernières valeurs dans sa_flags peut être moins portable dans les applications censées s'exécuter sur des implémentations UNIX anciennes.

L'option SA_RESETHAND est compatible avec l'option SVr4 du même nom.

Le drapeau SA_NODEFER est compatible avec le drapeau SVr4 du même nom pour les noyaux 1.3.9 et ultérieurs. Pour les noyaux plus anciens, Linux autorisera la réception de tous les signaux et pas seulement celui qu'on est en train de mettre en place (écrasant de fait sa_mask).

NOTES
Un enfant créé par fork(2) hérite d'une copie des actions des signaux de son parent. Lors d'un execve(2), les actions des signaux pris en charge sont remises aux valeurs par défaut ; les actions des signaux ignorés ne sont pas modifiées.

Comme spécifié par POSIX, le comportement d'un processus est indéfini après la réception d'un signal SIGFPE, SIGILL, ou SIGSEGV qui n'a pas été engendré par une fonction kill(2) ou raise(3). La division entière par zéro a un résultat indéfini, sur certaines architectures elle déclenche un signal SIGFPE. De même, diviser l'entier le plus négatif par -1 peut déclencher SIGFPE.

sigaction() peut être appelé avec un second argument NULL pour obtenir le gestionnaire de signaux actuel. On peut aussi vérifier si un signal est valide sur la machine actuelle en l'appelant avec les deuxième et troisième arguments qui valent NULL.

Il est impossible de bloquer SIGKILL or SIGSTOP (en les indiquant dans sa_mask). Les tentatives seront ignorées silencieusement.

Consultez sigsetops(3) pour les détails concernant les ensembles de signaux.

Consultez signal-safety(7) pour une liste de fonctions sûres pour les signaux asynchrones qui peuvent être appelées dans un gestionnaire de signal.

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.

  Non documenté
Avant l'introduction de l'attribut SA_SIGINFO il était déjà possible d'obtenir des informations supplémentaires sur un signal. Cela se faisait en fournissant au gestionnaire de signal sa_handler un second paramètre de type struct sigcontext, qui est la même structure que celle fournie dans le champ uc_mcontext de la structure ucontext passée (à l'aide d'un pointeur) comme troisième paramètre du gestionnaire sa_sigaction Consultez les sources du noyau Linux pertinentes pour des détails. Cette utilisation est désormais obsolète.

BOGUES
When delivering a signal resulting from a hardware exception with a SA_SIGINFO handler, the kernel does not always provide meaningful values for all of the fields of the siginfo_t that are relevant for that signal. For example, when the x86 int instruction is called with a forbidden argument (any number other than 3 or 128), a SIGSEGV signal is delivered, but the siginfo_t passed to the signal handler has all its fields besides si_signo and si_code set to zero, even if other fields should be set (as an example, si_addr should be non-zero for all SIGSEGV signals).

Jusqu'à Linux 2.6.13 inclus, indiquer SA_NODEFER dans sa_flags empêchait non seulement le signal reçu d'être masqué pendant l'exécution du gestionnaire, mais empêchait également les signaux de sa_mask d'être masqués. Ce bogue a été corrigé dans Linux 2.6.14.

EXEMPLES
Consultez mprotect(2).

  Sondage de la prise en charge d'un drapeau
Le programme d'exemple suivant quitte avec l'état EXIT_SUCCESS si SA_EXPOSE_TAGBITS a vocation à être pris en charge, ou sinon 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);
    }

VOIR AUSSI
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)

TRADUCTION
La traduction française de cette page de manuel a été créée par Christophe Blaess <https://www.blaess.fr/christophe/>, Stéphan Rafin <stephan.rafin@laposte.net>, Thierry Vignaud <tvignaud@mandriva.com>, François Micaux, Alain Portal <aportal@univ-montp2.fr>, Jean-Philippe Guérard <fevrier@tigreraye.org>, Jean-Luc Coulon (f5ibh) <jean-luc.coulon@wanadoo.fr>, Julien Cristau <jcristau@debian.org>, Thomas Huriaux <thomas.huriaux@gmail.com>, Nicolas François <nicolas.francois@centraliens.net>, Florentin Duneau <fduneau@gmail.com>, Simon Paillard <simon.paillard@resel.enst-bretagne.fr>, Denis Barbier <barbier@debian.org>, David Prévot <david@tilapin.org>, Cédric Boutillier <cedric.boutillier@gmail.com>, Frédéric Hantrais <fhantrais@gmail.com> et Jean-Philippe MENGUAL <jpmengual@debian.org>

Cette traduction est une documentation libre ; veuillez vous reporter à la GNU General Public License version 3 (https://www.gnu.org/licenses/gpl-3.0.html) concernant les conditions de copie et de distribution. Il n'y a aucune RESPONSABILITÉ LÉGALE.

Si vous découvrez un bogue dans la traduction de cette page de manuel, veuillez envoyer un message à debian-l10n-french@lists.debian.org.