sigaction(2) System Calls Manual sigaction(2) NOM sigaction, rt_sigaction - Examiner et modifier l'action associee a un signal BIBLIOTHEQUE Bibliotheque C standard (libc, -lc) SYNOPSIS #include int sigaction(int signum, const struct sigaction *_Nullable restrict act, struct sigaction *_Nullable restrict oldact); Exigences de macros de test de fonctionnalites pour la glibc (consulter feature_test_macros(7)) : sigaction() : _POSIX_C_SOURCE siginfo_t : _POSIX_C_SOURCE >= 199309L DESCRIPTION L'appel systeme sigaction() sert a modifier l'action effectuee par un processus a la reception d'un signal specifique. (Consultez signal(7) pour une vue d'ensemble sur les signaux) signum indique le signal concerne, a l'exception de SIGKILL et SIGSTOP. Si act n'est pas NULL, la nouvelle action pour le signal signum est definie par act. Si oldact n'est pas NULL, l'ancienne action est sauvegardee dans oldact. La structure sigaction est definie 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 simultanement sa_handler et sa_sigaction. Le champ sa_restorer n'est pas concu pour une utilisation dans une application (POSIX ne specifie pas de champ sa_restorer). Vous pouvez trouver plus de details sur l'objectif de ce champ dans sigreturn(2). sa_handler indique l'action a associer a signum et il peut s'agir d'une des suivantes : - SIG_DFL pour l'action par defaut. - SIG_IGN pour ignorer ce signal. - Un pointeur vers une fonction de gestion de signal. Cette fonction recoit le numero du signal comme seul parametre. Si SA_SIGINFO est indique dans sa_flags, sa_sigaction (et non sa_handler) indique la fonction de gestion de signal dans signum. Cette fonction recoit trois parametres, comme decrit ci-dessous. sa_mask specifie un masque de signaux a bloquer (c'est-a-dire ajoutes au masque de signaux du thread dans lequel le gestionnaire est appele) pendant l'execution du gestionnaire. De plus le signal ayant appele le gestionnaire est bloque a moins que l'attribut SA_NODEFER soit precise. sa_flags specifie un ensemble d'attributs qui modifient le comportement du signal. Il est forme par un OU binaire << | >>) entre les options suivantes : SA_NOCLDSTOP Si signum vaut SIGCHLD, ne pas recevoir les signaux de notification d'arret (quand l'enfant recoit un signal SIGSTOP, SIGTSTP, SIGTTIN ou SIGTTOU) ou de relance (quand il recoit 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 defini lors de la mise en place d'un gestionnaire pour SIGCHLD, POSIX.1 ne specifie pas si le signal SIGCHLD est genere lorsqu'un processus enfant se termine. Sous Linux, un signal SIGCHLD est genere dans ce cas ; sur d'autres implementations, il ne l'est pas. SA_NODEFER Ne pas ajouter le signal au masque de signal du thread pendant l'exeution du gestionnaire, sauf si le signal est indique dans act.sa_mask. Par consequent, une prochaine instance du signal pourra etre delivree au thread pendant qu'il execute le gestionnaire. Ce drapeau n'a de sens que lorsqu'on met en place un gestionnaire de signal. SA_NOMASK est un synonyme obsolete et non standard de ce drapeau. SA_ONSTACK Appeler le gestionnaire avec une pile differente fournie par sigaltstack(2). Si cette pile est indisponible, on utilisera la pile par defaut. Cet attribut n'a de sens que lors de la mise en place d'un gestionnaire de signal. SA_RESETHAND Retablir l'action a son comportement par defaut a l'entree 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 obsolete et non standard de ce drapeau. SA_RESTART Fournir un comportement compatible avec la semantique BSD en redemarrant automatiquement les appels systeme lents interrompus par l'arrivee 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 redemarrage d'un appel systeme. SA_RESTORER N'est pas concu pour etre utilise dans une application. Ce drapeau est utilise par les bibliotheques C pour indiquer que le champ sa_restorer contient l'adresse d'un << trampoline de signal >>. Consultez sigreturn(2) pour plus de details. 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) Utilise pour sonder de maniere dynamique la prise en charge des bits de drapeau. Si un essai d'enregistrement de gestionnaire reussit alors que ce drapeau est positionne sur act->sa_flags parmi d'autres drapeaux potentiellement non pris en charge par le noyau, et si un appel sigaction() immediatement consecutif indiquant un numero de signal et ayant un parametre oldact non NULL aboutit a un clear SA_UNSUPPORTED dans oldact->sa_flags, oldact->sa_flags peut etre utilise comme masque de bit decrivant les drapeaux potentiellement non pris en charge qui sont en realite geres. Consultez la section << Sonder dynamiquement la prise en charge de bits de drapeau >> ci-dessous pour plus de details. SA_EXPOSE_TAGBITS (depuis Linux 5.11) Normalement, lorsqu'un signal est delivre, un jeu de bits d'etiquettes specifique a l'architecture est vide depuis le champ si_addr de siginfo_t. Si ce drapeau est positionne, un sous-ensemble de bits d'etiquette specifique a l'architecture sera conserve dans si_addr. Les programmes qui doivent etre compatibles avec des versions de Linux superieures a la 5.11 doivent utiliser SA_UNSUPPORTED pour tester la prise en charge. Le parametre siginfo_t vers un gestionnaire SA_SIGINFO Quand le drapeau SA_SIGINFO est indique a act.sa_flags, l'adresse du gestionnaire de signal est passee a l'aide du champ act.sa_sigaction. Ce gestionnaire prend trois parametres comme suit : void handler(int sig, siginfo_t *info, void *ucontext) { ... } Ces trois parametres sont comme suit sig Le numero de signal qui a provoque l'appel du gestionnaire. info Un pointeur vers un siginfo_t, qui est une structure contenant plus d'informations sur le signal comme decrit ci-dessous. ucontext Il s'agit d'un pointeur vers une structure ucontext_t, diffusee sur void\ *. La structure vers laquelle pointe ce champ contient des informations contextuelles sur le signal sauvegardees dans la pile de l'espace utilisateur par le noyau ; pour des details, consultez sigreturn(2). Vous pouvez trouver plus d'informations sur la structure ucontext_t dans getcontext(3) et signal(7). Generalement, la fonction de gestionnaire n'utilise pas le troisieme parametre. Le type de donnees siginfo_t est une structure contenant les champs suivants : siginfo_t { int si_signo; /* Numero de signal */ int si_errno; /* Numero d'erreur */ int si_code; /* Code du signal */ int si_trapno; /* Numero de trappe qui a cause le signal genere par le materiel (pas utilise sur la plupart des architectures) */ pid_t si_pid; /* PID de l'emetteur */ uid_t si_uid; /* UID reel de l'emetteur */ int si_status; /* Valeur de sortie ou signal */ clock_t si_utime; /* Temps utilisateur ecoule */ clock_t si_stime; /* Temps systeme ecoule */ union sigval si_value; /* Valeur du signal */ int si_int; /* Signal POSIX.1b */ void *si_ptr; /* Signal POSIX.1b */ int si_overrun; /* Decompte de depassement des horloges (POSIX.1b) */ int si_timerid; /* ID d'horloge (POSIX.1b) */ void *si_addr; /* Emplacement memoire ayant cause l'erreur */ long si_band; /* Band event (etait int dans glibc 2.3.2 et anterieures */ 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 inferieure lorsqu'une violation d'adresse se produit (depuis Linux 3.19) */ void *si_upper; /* Limite superieure lorsqu'une violation d'adresse se produit (depuis Linux 3.19) */ int si_pkey; /* Cle de protection PTE a l'origine de l'ereur (depuis Linux 4.6) */ void *si_call_addr; /* Adresse de l'instruction d'appel systeme (depuis Linux 3.5) */ int si_syscall; /* Nombre d'appels systeme essayes (depuis Linux 3.5) */ unsigned int si_arch; /* Architecture des appels systeme essayes (depuis Linux 3.5) */ } si_signo, si_errno et si_code sont definis pour tous les signaux (si_errno n'est generalement pas utilise sous Linux). Le reste de la structure peut etre une union, de telle sorte qu'on puisse ne lire que les champs specifiques a un signal donne : - Les signaux envoyes avec kill(2) et sigqueue(3) remplissent si_pid et si_uid. De plus, les signaux envoyes avec sigqueue(3) remplissent si_int et si_ptr avec les valeurs indiquees par l'emetteur du signal ; consultez sigqueue(3) pour plus de details. - Les signaux envoyes par les horloges POSIX.1b (depuis Linux 2.6) remplissent si_overrun et si_timerid. Le champ si_timerid est un identifiant interne utilise par le noyau pour identifier l'horloge ; ce n'est pas la meme chose que l'identifient d'horloge renvoye par timer_create(2). Le champ si_overrun est le compteur de depassement de l'horloge ; il s'agit de la meme information renvoyee par un appel a timer_getoverrun(2). Ces champs sont des extensions Linux non standard. - Les signaux envoyes 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 a mq_notify(3) ; si_pid avec l'identifiant du processus de l'emetteur du message ; et si_uid avec l'identifiant d'utilisateur reel de l'emetteur 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 reel de l'enfant. Le champ si_status contient le code de sortie de l'enfant (si si_code vaut CLD_EXITED), ou le numero du signal qui a change l'etat du processus. Les champs si_utime et si_stime comprennent les temps utilisateur et systeme utilise par le processus enfant ; ces champs ne comprennent pas le temps utilise par les enfants lorsqu'ils sont attendus (au contraire de getrusage(2) et times(2)). Jusqu'a Linux 2.6, et depuis Linux 2.6.27, ces champs renvoient le temps CPU en unite 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 mesures en jiffy systeme (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 egalement si_addr_lsb. Ce champ indique le bit le moins significatif de l'adresse signalee et, donc, l'etendue de la corruption. Par exemple, si toute une page est corrompue, si_addr_lsb contient log2(sysconf(_SC_PAGESIZE)). Lorsque SIGTRAP est delivre en reponse a un evenement ptrace(2) ((PTRACE_EVENT_foo), si_addr n'est pas peuple 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 affiche comme delivrant un evenement. BUS_MCEERR_* et si_addr_lsb sont des extensions specifiques a 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'evenement si_band est un masque de bits contenant les memes 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'evenement d'entrees-sorties s'est produit. Pour plus de details, voir la description de F_SETSIG dans fcntl(2). - SIGSYS, genere (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 decrits dans seccomp(2). Le champ si_code Le champ si_code du parametre siginfo_t passe a 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 evenement ptrace(2), si_code contiendra SIGTRAP et aura l'evenement ptrace dans l'octet fort : (SIGTRAP | PTRACE_EVENT_foo << 8). Pour un evenement non ptrace(2), les valeurs qui peuvent apparaitre dans si_code sont decrites dans le reste de cette section. Depuis la glibc 2.20, les definitions de la plupart de ces symboles viennent de en definissant des macros de test de fonctionnalites (avant l'inclusion de tout fichier d'en-tete) comme suit : - _XOPEN_SOURCE avec la valeur 500 ou superieure ; - _XOPEN_SOURCE et _XOPEN_SOURCE_EXTENDED ; ou - _POSIX_C_SOURCE avec la valeur 200809L ou superieure. Pour les constantes TRAP_*, les definitions de symboles ne sont fournies que dans les deux premiers cas. Avant la glibc 2.20, aucune macro de test n'etait necessaire 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 associee. SI_USER kill(2). SI_KERNEL Envoye par le noyau. SI_QUEUE sigqueue(3). SI_TIMER Fin d'une temporisation POSIX. SI_MESGQ (depuis Linux 2.6.6) Changement d'etat d'une file de messages ; voir mq_notify(3). SI_ASYNCIO Fin d'une AIO. SI_SIGIO SIGIO avec file d'attente (seulement jusqu'a Linux 2.2 ; a partir de Linux 2.4, SIGIO/SIGPOLL remplit si_code de la facon decrite plus bas). SI_TKILL (depuis Linux 2.4.19) tkill(2) ou tgkill(2). Les valeurs suivantes peuvent etre prises par si_code pour un signal SIGILL : ILL_ILLOPC opcode illegal. ILL_ILLOPN operande illegale. ILL_ILLADR Mode d'adressage illegal. ILL_ILLTRP Trappe illegale. ILL_PRVOPC Opcode privilegie. ILL_PRVREG Registre privilegie. ILL_COPROC Erreur de coprocesseur. ILL_BADSTK erreur interne de pile. Les valeurs suivantes peuvent etre prises par si_code pour un signal SIGFPE : FPE_INTDIV division entiere par zero. FPE_INTOVF debordement entier. FPE_FLTDIV division flottante par zero. FPE_FLTOVF debordement flottant. FPE_FLTUND debordement inferieur flottant. FPE_FLTRES resultat flottant inexact. FPE_FLTINV operation flottante invalide. FPE_FLTSUB indice hors intervalle. Les valeurs suivantes peuvent etre 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) Verification des limites de l'adresse echouee. SEGV_PKUERR (depuis Linux 4.6) Acces interdit par des cles de protection de la memoire. Consultez pkeys(7). La cle de protection applicable a cet acces est disponible a l'aide de si_pkey. Les valeurs suivantes peuvent etre prises par si_code pour un signal SIGBUS : BUS_ADRALN alignement d'adresse non valable. BUS_ADRERR adresse physique inexistante. BUS_OBJERR erreur materielle specifique. BUS_MCEERR_AR (depuis Linux 2.6.32) erreur memoire materielle consommee lors de verification de la machine ; action requise. BUS_MCEERR_AO (depuis Linux 2.6.32) erreur memoire materielle detectee dans le processus mais non consommee ; action optionnelle. Les valeurs suivantes peuvent etre prises par si_code pour un signal SIGTRAP : TRAP_BRKPT point d'arret du processus. TRAP_TRACE trappe dans le suivi d'execution 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'arret/point a surveiller materiels. Les valeurs suivantes peuvent etre prises par si_code pour un signal SIGCHLD : CLD_EXITED enfant termine normalement. CLD_KILLED enfant tue par un signal. CLD_DUMPED enfant termine anormalement. CLD_TRAPPED l'enfant en cours de suivi a une trappe. CLD_STOPPED L'enfant s'est arrete. CLD_CONTINUED (depuis Linux 2.6.9) l'enfant arrete a redemarre. Les valeurs suivantes peuvent etre prises par si_code pour un signal SIGIO/SIGPOLL : POLL_IN donnees disponibles en entree. POLL_OUT tampons de sortie libres. POLL_MSG message disponible en entree. POLL_ERR Erreur d'entree-sortie. POLL_PRI entree a haute priorite disponible. POLL_HUP peripherique debranche. Les valeurs suivantes peuvent etre prises par si_code pour un signal SIGSYS : SYS_SECCOMP (depuis Linux 3.5) Differe par une regle 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, a partir de Linux 5.11, est qu'un deuxieme sigaction(2) videra les bits inconnus de oldact->sa_flags. Toutefois, historiquement, un second appel sigaction() laissait generalement ces ensembles de bits dans oldact->sa_flags. Cela signifie que la prise en charge de nouveaux drapeaux ne peut pas etre detectee par un simple test du drapeau sa_flags dans sa_flags et un programme doit tester que SA_UNSUPPORTED a ete vide avant de s'appuyer sur le contenu de sa_flags. Comme le comportement du gestionnaire ne peut pas etre garanti, sauf si la verification reussit, il vaut mieux soit bloquer le signal concerne tout en enregistrant le gestionnaire puis effectuer la verification dans ce cas, soit, quand cela n'est pas possible, par exemple si le signal est synchrone, effectuer le deuxieme sigaction() dans le gestionnaire de signal lui-meme. Dans les noyaux qui ne prennent pas en charge un drapeau en particulier, le comportement du noyau est le meme que si le drapeau n'etait pas positionne, meme si ce dernier a ete positionne avec act->sa_flags. Les drapeaux SA_NOCLDSTOP, SA_NOCLDWAIT, SA_SIGINFO, SA_ONSTACK, SA_RESTART, SA_NODEFER, SA_RESETHAND et, s'il est defini par l'architecture, SA_RESTORER, peuvent ne pas etre sondes de maniere fiable si on utilise ce mecanisme, parce qu'ils ont ete introduits avant Linux 5.11. Cependant, en general, les programmes peuvent supposer que ces drapeaux sont pris en charge car ils le sont depuis Linux 2.6, publie en 2003. Consultez les EXEMPLES ci-dessous pour une demonstration de l'utilisation de SA_UNSUPPORTED. VALEUR RENVOYEE sigaction() renvoie 0 s'il reussit. En cas d'erreur, -1 est renvoye 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 indique. Cela se produit egalement si l'on tente de modifier l'action associee aux signaux SIGKILL ou SIGSTOP, qui ne peuvent pas etre interceptes ou ignores. VERSIONS Differences entre bibliotheque 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 reel utilises en interne par l'implementation de threading de NPTL. Consultez nptl(7) pour plus de details. Sur des architectures ou le trampoline du signal se trouve dans la bibliotheque C, la fonction enveloppe de la bibliotheque 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 systeme Linux d'origine s'appelait sigaction(). Toutefois, avec l'arrivee des signaux en temps reel dans Linux 2.2 et de la taille figee, le type sigset_t 32 bits pris en charge par cet appel systeme ne convenait plus a cet objectif. Par consequent, un nouvel appel systeme rt_sigaction() a ete ajoute pour prendre en charge le type sigset_t elargi. Le nouvel appel systeme prend un quatrieme parametre, size_t sigsetsize, qui indique la taille en octets des jeux de signal dans act.sa_mask et oldact.sa_mask. Ce parametre est actuellement necessaire pour obtenir la valeur sizeof(sigset_t) (ou le resultat de l'erreur EINVAL). La fonction enveloppe sigaction() de la glibc nous cache ces details en appelant de maniere 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'eviter la creation de zombies (consultez wait(2)). Cependant, les comportements historiques de BSD et de System V quand SIGCHLD est ignore different, si bien que la seule methode completement portable pour s'assurer que les enfants ne deviennent pas des zombies a leur terminaison est d'intercepter le signal SIGCHLD et d'invoquer wait(2) ou equivalent. POSIX.1-1990 ne documentait que SA_NOCLDSTOP. POSIX.1-2001 a ajoute SA_NOCLDWAIT, SA_RESETHAND, SA_NODEFER, SA_ONSTACK, SA_RESETHAND, SA_RESTART et SA_SIGINFO. L'utilisation de ces dernieres valeurs dans sa_flags peut etre moins portable dans les applications censees s'executer sur des implementations UNIX anciennes. L'option SA_RESETHAND est compatible avec l'option SVr4 du meme nom. Le drapeau SA_NODEFER est compatible avec le drapeau SVr4 du meme nom pour les noyaux 1.3.9 et ulterieurs. Pour les noyaux plus anciens, Linux autorisera la reception de tous les signaux et pas seulement celui qu'on est en train de mettre en place (ecrasant de fait sa_mask). NOTES Un enfant cree par fork(2) herite 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 defaut ; les actions des signaux ignores ne sont pas modifiees. Comme specifie par POSIX, le comportement d'un processus est indefini apres la reception d'un signal SIGFPE, SIGILL, ou SIGSEGV qui n'a pas ete engendre par une fonction kill(2) ou raise(3). La division entiere par zero a un resultat indefini, sur certaines architectures elle declenche un signal SIGFPE. De meme, diviser l'entier le plus negatif par -1 peut declencher SIGFPE. sigaction() peut etre appele avec un second argument NULL pour obtenir le gestionnaire de signaux actuel. On peut aussi verifier si un signal est valide sur la machine actuelle en l'appelant avec les deuxieme et troisieme arguments qui valent NULL. Il est impossible de bloquer SIGKILL or SIGSTOP (en les indiquant dans sa_mask). Les tentatives seront ignorees silencieusement. Consultez sigsetops(3) pour les details concernant les ensembles de signaux. Consultez signal-safety(7) pour une liste de fonctions sures pour les signaux asynchrones qui peuvent etre appelees dans un gestionnaire de signal. Non documente Avant l'introduction de l'attribut SA_SIGINFO il etait deja possible d'obtenir des informations supplementaires sur un signal. Cela se faisait en fournissant au gestionnaire de signal sa_handler un second parametre de type struct sigcontext, qui est la meme structure que celle fournie dans le champ uc_mcontext de la structure ucontext passee (a l'aide d'un pointeur) comme troisieme parametre du gestionnaire sa_sigaction Consultez les sources du noyau Linux pertinentes pour des details. Cette utilisation est desormais obsolete. BOGUES Au moment ou un signal est delivre avec le gestionnaire SA_SIGINFO, le noyau ne fournit pas toujours des valeurs significatives pour tous les champs de siginfo_t coherentes pour ce signal. Jusqu'a Linux 2.6.13 inclus, indiquer SA_NODEFER dans sa_flags empechait non seulement le signal recu d'etre masque pendant l'execution du gestionnaire, mais empechait egalement les signaux de sa_mask d'etre masques. Ce bogue a ete corrige 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'etat EXIT_SUCCESS si SA_EXPOSE_TAGBITS a vocation a etre pris en charge, ou sinon EXIT_FAILURE. #include #include #include #include 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 francaise de cette page de manuel a ete creee par Christophe Blaess , Stephan Rafin , Thierry Vignaud , Francois Micaux, Alain Portal , Jean-Philippe Guerard , Jean-Luc Coulon (f5ibh) , Julien Cristau , Thomas Huriaux , Nicolas Francois , Florentin Duneau , Simon Paillard , Denis Barbier , David Prevot , Cedric Boutillier , Frederic Hantrais et Jean-Philippe MENGUAL Cette traduction est une documentation libre ; veuillez vous reporter a la GNU General Public License version 3 concernant les conditions de copie et de distribution. Il n'y a aucune RESPONSABILITE LEGALE. Si vous decouvrez un bogue dans la traduction de cette page de manuel, veuillez envoyer un message a . Pages du manuel de Linux 6.06 31 octobre 2023 sigaction(2)