Provided by: manpages-fr-dev_4.26.0-1_all bug

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;    /* 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)).  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
                  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 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).

       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.

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.

STANDARDS

       POSIX.1-2008.

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.

   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.

       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>

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

Pages du manuel de Linux 6.9.1                     2 mai 2024                                       sigaction(2)