Provided by: manpages-fr-dev_3.65d1p1-1_all 

NOM
sigaction - Examiner et modifier l'action associée à un signal
SYNOPSIS
#include <signal.h>
int sigaction(int signum, const struct sigaction *act,
struct sigaction *oldact);
Exigences de macros de test de fonctionnalités pour la glibc (consultez feature_test_macros(7)) :
sigaction() : _POSIX_C_SOURCE >= 1 || _XOPEN_SOURCE || _POSIX_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.
L'élément sa_restorer est obsolète et ne devrait pas être utilisé, POSIX ne mentionne pas de membre
sa_restorer.
sa_handler indique l'action affectée au signal signum, et peut être SIG_DFL pour l'action par défaut,
SIG_IGN pour ignorer le signal, ou un pointeur sur une fonction de gestion de signaux.
Si SA_SIGINFO est indiqué dans sa_flags, alors sa_sigaction (plutôt que sa_handler) pointe vers le
gestionnaire de signal pour signum. Cette fonction prend le numéro du signal comme premier argument, un
pointeur vers un siginfo_t comme second argument, et un pointeur vers un ucontext_t (transtypé en void *)
comme troisième paramètre. (Généralement, le gestionnaire de signal n'utilise pas le troisième argument.
Consultez getcontext(3) pour plus d'informations au sujet de ucontext_t.)
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 le fils
reçoit un signal SIGSTOP, SIGTSTP, SIGTTIN ou SIGTTOU) ou de relance (quand il reçoit SIGCONT)
des processus fils. 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 fils 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 fils 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 empêcher un signal d'être reçu depuis l'intérieur de son propre gestionnaire. Cet
attribut n'a de sens que lors de la mise en place d'un gestionnaire de signal. SA_NOMASK est
un synonyme obsolète et non standard pour cet attribut.
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 pour cet attribut.
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_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.
Le paramètre siginfo_t de la routine sa_sigaction est une structure contenant les éléments 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é */
sigval_t si_value; /* Valeur de 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) */
}
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 fils. Le champ si_pid est l'identifiant de processus du fils ; si_uid est l'identifiant
d'utilisateur réel du fils. Le champ si_status contient le code de sortie du fils (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 fils ; ces champs ne comprennent
pas le temps utilisé par les fils lorsqu'ils sont attendus (au contraire de getrusage(2) et time(2)).
Dans les noyaux antérieurs à la version 2.6, et depuis la version 2.6.27, ces champs renvoient le temps
CPU en unité de sysconf(_SC_CLK_TCK). Dans les noyaux de la série 2.6, avant le noyau 2.6.27, un bogue
faisait que ces champs renvoyaient des temps mesurés en jiffy système (consultez time(7)).
* SIGILL, SIGFPE, SIGSEGV, SIGBUS et SIGTRAP remplissent si_addr avec l'adresse de l'erreur. Sur
certaines architectures, ces signaux remplissent aussi le champ si_trapno. Certaines catégories
d'erreurs de SIGBUS, en particulier BUS_MCEERR_AO et BUS_MCEERR_AR, remplissent aussi le champ
si_addr_lsb, qui contient le bit le moins significatif de l'erreur signalée, et permet donc de
connaître l'étendue de la corruption des données. Par exemple, si une page entière est corrompue,
si_addr_lsb contient log2(sysconf(_SC_PAGESIZE)). BUS_MCERR_* et si_addr_lsb sont des extensions
spécifiques à Linux.
* 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.
si_code est une valeur (pas un masque de bits) qui indique pourquoi ce signal a été envoyé. 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 Changement d'état d'une file de messages (depuis Linux 2.6.6) ; consultez mq_notify(3)
SI_ASYNCIO Fin d'une AIO
SI_SIGIO SIGIO avec file d'attente (seulement dans les noyaux Linux jusqu'aux versions 2.2 ; à
partir de Linux 2.4, SIGIO/SIGPOLL remplit si_code de la façon décrite plus bas).
SI_TKILL tkill(2) ou tgkill(2) (depuis Linux 2.4.19)
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
Les valeurs suivantes peuvent être prises par si_code pour un signal SIGBUS :
BUS_ADRALN alignement d'adresse invalide
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 suivi d'exécution du processus
TRAP_BRANCH (depuis Linux 2.4)
suivi des branches prises par le processus
TRAP_HWBKPT (depuis Linux 2.4)
point d'arrêt/point à surveiller matériels
Les valeurs suivantes peuvent être prises par si_code pour un signal SIGCHLD :
CLD_EXITED fils terminé normalement
CLD_KILLED fils tué par un signal
CLD_DUMPED fils terminé anormalement
CLD_TRAPPED fils en cours de suivi
CLD_STOPPED fils arrêté
CLD_CONTINUED fils arrêté a redémarré (depuis Linux 2.6.9)
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é
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 invalide est indiqué. Ceci se produit également si l'on tente de modifier l'action
associée aux signaux SIGKILL ou SIGSTOP, qui ne peuvent pas être interceptés ou ignorés.
CONFORMITÉ
POSIX.1-2001, SVr4.
NOTES
Un fils créé par fork(2) hérite d'une copie des dispositions de signaux de son père. Lors d'un execve(2),
les dispositions des signaux pris en charge sont remises aux valeurs par défaut ; les dispositions 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 d'ignorer 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, donc la seule méthode complètement portable
pour s'assurer que les fils ne deviennent pas des zombies à leur terminaison est d'intercepter le signal
SIGCHLD et d'invoquer wait(2) ou équivalent.
POSIX.1-1990 ne documentait que SA_NOCLDSTOP. POSIX.1-2001 a ajouté SA_NOCLDWAIT, SA_RESETHAND,
SA_NODEFER 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.
L'option SA_NODEFER est compatible avec l'option 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
qui vient de se déclencher (écrasant effectivement sa_mask ).
sigaction() peut être appelé avec un second argument à NULL pour obtenir le gestionnaire de signaux
actuel. On peut aussi vérifier si un signal est valide sur la machine actuelle en l'appelant avec les
deuxième et troisième arguments qui valent NULL.
Il est impossible de bloquer SIGKILL or SIGSTOP (en les indiquant dans sa_mask). Les tentatives seront
ignorées silencieusement.
Consultez sigsetops(3) pour les détails concernant les ensembles de signaux.
Consultez signal(7) pour une liste de fonctions sûres pour les signaux asynchrones qui peuvent être
appelée dans les gestionnaires de signaux.
Non documenté
Avant l'introduction de l'attribut SA_SIGINFO il était déjà possible d'obtenir des informations
supplémentaires, en ajoutant au sa_handler un second paramètre de type struct sigcontext. On peut
retrouver ceci dans les sources du noyau Linux. Ce mécanisme est désormais obsolète.
BOGUES
Dans les noyaux jusqu'à 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.
EXEMPLE
Consultez mprotect(2).
VOIR AUSSI
kill(1), kill(2), killpg(2), pause(2), restart_syscall(2), sigaltstack(2), signal(2), signalfd(2),
sigpending(2), sigprocmask(2), sigsuspend(2), wait(2), raise(3), siginterrupt(3), sigqueue(3),
sigsetops(3), sigvec(3), core(5), signal(7)
COLOPHON
Cette page fait partie de la publication 3.65 du projet man-pages Linux. Une description du projet et des
instructions pour signaler des anomalies peuvent être trouvées à l'adresse
http://www.kernel.org/doc/man-pages/.
TRADUCTION
Depuis 2010, cette traduction est maintenue à l'aide de l'outil po4a <http://po4a.alioth.debian.org/> par
l'équipe de traduction francophone au sein du projet perkamon <http://perkamon.alioth.debian.org/>.
Christophe Blaess <http://www.blaess.fr/christophe/> (1996-2003), Alain Portal
<http://manpagesfr.free.fr/> (2003-2006). Julien Cristau et l'équipe francophone de traduction de
Debian (2006-2009).
Veuillez signaler toute erreur de traduction en écrivant à <debian-l10n-french@lists.debian.org> ou par
un rapport de bogue sur le paquet manpages-fr.
Vous pouvez toujours avoir accès à la version anglaise de ce document en utilisant la commande « man -L C
<section> <page_de_man> ».
Linux 30 juillet 2013 SIGACTION(2)