dwww Home | Manual pages | Find package

sigaction(2)                  System Calls Manual                 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  sauve-
       gardé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  ap-
       plication  (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_hand-
       ler)  indique la fonction de gestion de signal dans signum. Cette fonc-
       tion 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 sui-
       vantes :

       SA_NOCLDSTOP
              Si signum vaut SIGCHLD, ne pas recevoir les signaux de notifica-
              tion 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 zom-
              bies lorsqu'ils se terminent. Consultez  aussi  waitpid(2).  Cet
              attribut  n'a de sens que lors de la mise en place d'un gestion-
              naire pour SIGCHLD, ou lors de la configuration de  la  disposi-
              tion 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 gestion-
              naire. Ce drapeau n'a de sens que lorsqu'on met en place un ges-
              tionnaire de signal.

              SA_NOMASK est un synonyme obsolète et non standard  de  ce  dra-
              peau.

       SA_ONSTACK
              Appeler le gestionnaire avec une pile différente fournie par si-
              galtstack(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  dra-
              peau.

       SA_RESTART
              Fournir un comportement compatible avec la sémantique BSD en re-
              dé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 dra-
              peau est utilisé par les bibliothèques C pour  indiquer  que  le
              champ  sa_restorer  contient  l'adresse d'un « trampoline de si-
              gnal ». 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 dra-
              peaux 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 po-
              tentiellement  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'éti-
              quettes spécifique à l'architecture est  vidé  depuis  le  champ
              si_addr  de siginfo_t. Si ce drapeau est positionné, un sous-en-
              semble 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  troi-
              siè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 si-
          gnal ; 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 ap-
          pel à 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 mes-
          sage.

       •  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'identi-
          fiant 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  nu-
          mé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  getru-
          sage(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 rem-
          plissent 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'éten-
          due 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_up-
          per.

          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 va-
          leurs 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 si-
       gnal 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  four-
       nies  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_no-
                  tify(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 Li-
       nux 5.11, est qu'un deuxième sigaction(2) videra les bits  inconnus  de
       oldact->sa_flags.  Toutefois,  historiquement,  un  second appel sigac-
       tion()  laissait  généralement  ces  ensembles   de   bits   dans   ol-
       dact->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'ap-
       puyer 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 si-
       gnal est synchrone, effectuer le deuxième sigaction() dans le  gestion-
       naire de signal lui-même.

       Dans  les  noyaux  qui ne prennent pas en charge un drapeau en particu-
       lier, 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'archi-
       tecture,  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  Li-
       nux 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,  pu-
       blié en 2003.

       Consultez  les EXEMPLES ci-dessous pour une démonstration de l'utilisa-
       tion 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 acces-
              sible.

       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.

STANDARDS
       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.  PO-
       SIX.1-2001 l'autorise, et ignorer SIGCHLD permet donc d'éviter la créa-
       tion de zombies (consultez wait(2)). Cependant, les comportements  his-
       toriques  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'inter-
       cepter 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, Li-
       nux 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 si-
       gnaux.

       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  er-
       reur  (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 bi-
       bliothèque C, la fonction enveloppe de la bibliothèque C autour de  si-
       gaction() met l'adresse du code de trampoline dans le champ act.sa_res-
       torer 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  fi-
       gé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 fai-
       sait en fournissant au gestionnaire de signal sa_handler un second  pa-
       ramè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_si-
       gaction 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_FAI-
       LURE.

       #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), sig-
       procmask(2), sigreturn(2), sigsuspend(2), wait(2), killpg(3), raise(3),
       siginterrupt(3),  sigqueue(3),  sigsetops(3),  sigvec(3),  core(5), si-
       gnal(7)

TRADUCTION
       La traduction française de cette page de manuel a été créée par  Chris-
       tophe  Blaess  <https://www.blaess.fr/christophe/>, Stéphan Rafin <ste-
       phan.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.cou-
       lon@wanadoo.fr>,  Julien  Cristau <jcristau@debian.org>, Thomas Huriaux
       <thomas.huriaux@gmail.com>, Nicolas François  <nicolas.francois@centra-
       liens.net>,  Florentin  Duneau <fduneau@gmail.com>, Simon Paillard <si-
       mon.paillard@resel.enst-bretagne.fr>,   Denis   Barbier    <barbier@de-
       bian.org>,  David  Prévot  <david@tilapin.org>,  Cédric Boutillier <ce-
       dric.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⟩.

Pages du manuel de Linux 6.03   10 février 2023                   sigaction(2)

Generated by dwww version 1.15 on Sat Jun 29 01:34:24 CEST 2024.