Provided by: manpages-fr-dev_4.15.0-9_all bug

NOM

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

SYNOPSIS

       #include <signal.h>

       int sigaction(int signum, const struct sigaction *restrict act,
                     struct sigaction *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;    /* Numéro de signal           */
               int      si_errno;    /* Numéro d'erreur            */
               int      si_code;     /* Code du signal             */
               int      si_trapno;   /* Numéro de trappe qui a causé
                                        le signal généré par le
                                        matériel (pas utilisé sur la
                                        plupart des architectures) */
               pid_t    si_pid;      /* PID de l'émetteur          */
               uid_t    si_uid;      /* UID réel de l'émetteur     */
               int      si_status;   /* Valeur de sortie ou signal */
               clock_t  si_utime;    /* Temps utilisateur écoulé   */
               clock_t  si_stime;    /* Temps système écoulé       */
               union sigval si_value; /* Valeur du signal */
               int      si_int;      /* Signal POSIX.1b            */
               void    *si_ptr;      /* Signal POSIX.1b            */
               int      si_overrun;  /* Décompte de dépassement des
                                        horloges (POSIX.1b)        */
               int      si_timerid;  /* ID d'horloge (POSIX.1b)    */
               void    *si_addr;     /* Emplacement mémoire ayant
                                        causé l'erreur             */
               long     si_band;     /* Band event (était int dans
                                        glibc 2.3.2 et antérieures */
               int      si_fd;       /* Descripteur de fichier     */
               short    si_addr_lsb; /* Bit le moins significatif de l'adresse
                                        (depuis Linux 2.6.32)   */
               void    *si_lower;     /* Limite inférieure lorsqu'une violation
                                         d'adresse se produit (depuis Linux 3.19) */
               void    *si_upper;     /* Limite supérieure lorsqu'une violation
                                         d'adresse se produit (depuis Linux 3.19) */
               int      si_pkey;      /* Clé de protection PTE à l'origine de
                                         l'ereur (depuis Linux 4.6) */
               void    *si_call_addr; /* Adresse de l'instruction d'appel système
                                         (depuis Linux 3.5) */
               int      si_syscall;   /* Nombre d'appels système essayés
                                         (depuis Linux 3.5) */
               unsigned int si_arch;  /* Architecture des appels système essayés
                                         (depuis 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)).  Dans  les noyaux antérieurs à la version 2.6, et depuis la
         version 2.6.27, ces champs renvoient le temps CPU en unité de sysconf(_SC_CLK_TCK). Dans
         les  noyaux  de  la  série 2.6,  avant  le noyau 2.6.27, un bogue faisait que ces champs
         renvoyaient des temps mesurés en jiffy système (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
                  Fin d'une temporisation POSIX.

           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  dans  les  noyaux  Linux  jusqu'aux
                  versions 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).

       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.

       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.

       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 (depuis Linux 2.4, IA64 seulement)
                  trappe dans le suivi des branches prises par le processus.

           TRAP_HWBKPT (depuis Linux 2.4, IA64 seulement)
                  point d'arrêt/point à surveiller matériels.

       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é.

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

           SYS_SECCOMP (depuis Linux 3.5)
                  Différé par une règle de filtrage seccomp(2).

   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.

CONFORMITÉ

       POSIX.1-2001, POSIX.1-2008, SVr4.

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.

       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_RESETHAND,    SA_NODEFER,   SA_ONSTACK,   SA_RESETHAND,   SA_RESTART   et   SA_SIGINFO.
       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).

       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.

   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.

   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

       Au  moment  où  un signal est délivré avec le gestionnaire SA_SIGINFO, le noyau ne fournit
       pas toujours des valeurs significatives pour tous les champs de siginfo_t cohérentes  pour
       ce signal.

       Dans  les  noyaux  jusqu'au 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 <stdlib.h>
       #include <stdio.h>
       #include <unistd.h>

       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)

COLOPHON

       Cette  page  fait partie de la publication 5.13 du projet man-pages Linux. Une description
       du projet et des instructions pour signaler des anomalies et la dernière version de  cette
       page peuvent être trouvées à l'adresse https://www.kernel.org/doc/man-pages/.

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⟩.