Provided by:
manpages-fr-dev_3.27fr1.4-1_all 
NOM
sigaction - Examiner et modifier l'action associee a un signal
SYNOPSIS
#include <signal.h>
int sigaction(int signum, const struct sigaction *act,
struct sigaction *oldact);
Exigences de macros de test de fonctionnalites pour la glibc (consultez
feature_test_macros(7)) :
sigaction() : _POSIX_C_SOURCE >= 1 || _XOPEN_SOURCE || _POSIX_SOURCE
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.
L'element sa_restorer est obsolete et ne devrait pas etre utilise,
POSIX ne mentionne pas de membre sa_restorer.
sa_handler indique l'action affectee au signal signum, et peut etre
SIG_DFL pour l'action par defaut, SIG_IGN pour ignorer le signal, ou un
pointeur sur une fonction de gestion de signaux.
Si SA_SIGINFO est indique dans sa_flags, alors sa_sigaction (plutot que
sa_handler) pointe vers le gestionnaire de signal pour signum. Cette
fonction prend le numero du signal comme premier argument, un pointeur
vers un siginfo_t comme second argument, et un pointeur vers un
ucontext_t (transtype en void *) comme troisieme parametre.
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 le fils recoit un signal
SIGSTOP, SIGTSTP, SIGTTIN ou SIGTTOU) ou de relance (quand
il recoit 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 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 fils
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 empecher un signal d'etre recu depuis l'interieur 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 obsolete et non standard pour cet attribut.
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 une fois que
le gestionnaire a ete appele. 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 pour cet
attribut.
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_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 parametre siginfo_t de la routine sa_sigaction est une structure
contenant les elements 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 */
sigval_t si_value; /* Valeur de 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 le noyau 2.6.32) */
}
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 lire les
champs specifiques a chaque signaux.
* Les signaux envoyes avec kill(2) et sigqueue(2) remplissent si_pid et
si_uid. De plus, les signaux envoyes avec sigqueue(2) remplissent
si_int et si_ptr avec les valeurs specifiees par l'emetteur du
signal ; voyez sigqueue(2) 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 fils. Le champ si_pid est
l'identifiant de processus du fils ; si_uid est l'identifiant
d'utilisateur reel du fils. Le champ si_status contient le code de
sortie du fils (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
fils ; ces champs ne comprennent pas le temps utilise par les fils
lorsqu'ils sont attendus (au contraire de getrusage(2) et time(2)).
Dans les noyaux anterieurs a la version 2.6, et depuis la version
2.6.27, ces champs renvoient le temps CPU en unite de
sysconf(_SC_CLK_TCK). Dans les noyaux de la serie 2.6, avant le noyau
2.6.27, un bogue faisait que ces champs renvoyaient des temps mesures
en jiffy systeme (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 categories 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 signalee, et permet donc de connaitre l'etendue de la
corruption des donnees. Par exemple, si une page entiere est
corrompue, si_addr_lsb contient log2(sysconf(_SC_PAGESIZE)).
BUS_MCERR_* et si_addr_lsb sont des extensions specifiques a Linux.
* SIGPOLL/SIGIO 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.
si_code est une valeur (pas un masque de bits) qui indique pourquoi ce
signal a ete envoye. La liste suivante indique les valeurs que peut
prendre si_code pour n'importe quel signal, avec la raison associee.
SI_USER kill(2) ou raise(3)
SI_KERNEL Envoye par le noyau.
SI_QUEUE sigqueue(2)
SI_TIMER Fin d'une temporisation POSIX
SI_MESGQ Changement d'etat d'une file de messages (depuis
Linux 2.6.6) ; consultez mq_notify(3)
SI_ASYNCIO Fin d'une AIO
SI_SIGIO SIGIO empile
SI_TKILL tkill(2) ou tgkill(2) (depuis Linux 2.4.19)
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
Les valeurs suivantes peuvent etre prises par si_code pour un signal
SIGBUS :
BUS_ADRALN alignement d'adresse invalide
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 suivi d'execution du processus
TRAP_BRANCH (depuis Linux 2.4)
suivi des branches prises par le processus
TRAP_HWBKPT (depuis Linux 2.4)
point d'arret/point a surveiller materiels
Les valeurs suivantes peuvent etre prises par si_code pour un signal
SIGCHLD :
CLD_EXITED fils termine normalement
CLD_KILLED fils tue par un signal
CLD_DUMPED fils termine anormalement
CLD_TRAPPED fils en cours de suivi
CLD_STOPPED fils arrete
CLD_CONTINUED fils arrete a redemarre (depuis Linux 2.6.9)
Les valeurs suivantes peuvent etre prises par si_code pour un signal
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 haute priorite disponible
POLL_HUP peripherique debranche
VALEUR RENVOY'EE
sigaction() renvoie 0 s'il reussit, et -1 en cas d'erreur.
ERREURS
EFAULT act ou oldact pointent en-dehors de l'espace d'adressage
accessible.
EINVAL Un signal invalide est indique. Ceci 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.
CONFORMIT'E
POSIX.1-2001, SVr4.
NOTES
Un fils cree par fork(2) herite d'une copie des dispositions de signaux
de son pere. Lors d'un execve(2), les dispositions des signaux pris en
charge sont remises aux valeurs par defaut ; les dispositions 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.
POSIX.1-1990 interdisait d'ignorer 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, donc la seule
methode completement portable pour s'assurer que les fils 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 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.
L'option SA_NODEFER est compatible avec l'option 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 qui
vient de se declencher (ecrasant effectivement sa_mask ).
sigaction() peut etre appele avec un second argument a 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(7) pour une liste de fonctions sures pour les signaux
asynchrones qui peuvent etre appelee dans les gestionnaires de signaux.
Non document'e
Avant l'introduction de l'attribut SA_SIGINFO il etait deja possible
d'obtenir des informations supplementaires, en ajoutant au sa_handler
un second parametre de type struct sigcontext. On peut retrouver ceci
dans les sources du noyau. Ce mecanisme est desormais obsolete.
BOGUES
Dans les noyaux jusqu'a 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.
EXEMPLE
Consultez mprotect(2).
VOIR AUSSI
kill(1), kill(2), killpg(2), pause(2), sigaltstack(2), signal(2),
signalfd(2), sigpending(2), sigprocmask(2), sigqueue(2), sigsuspend(2),
wait(2), raise(3), siginterrupt(3), sigsetops(3), sigvec(3), core(5),
signal(7)
COLOPHON
Cette page fait partie de la publication 3.27 du projet man-pages
Linux. Une description du projet et des instructions pour signaler des
anomalies peuvent etre trouvees a l'adresse
<URL:http://www.kernel.org/doc/man-pages/>.
TRADUCTION
Depuis 2010, cette traduction est maintenue a l'aide de l'outil po4a
<URL:http://po4a.alioth.debian.org/> par l'equipe de traduction
francophone au sein du projet perkamon
<URL:http://perkamon.alioth.debian.org/>.
Christophe Blaess <URL:http://www.blaess.fr/christophe/> (1996-2003),
Alain Portal <URL:http://manpagesfr.free.fr/> (2003-2006). Julien
Cristau et l'equipe francophone de traduction de Debian (2006-2009).
Veuillez signaler toute erreur de traduction en ecrivant a
<debian-l10n-french@lists.debian.org> ou par un rapport de bogue sur le
paquet manpages-fr.
Vous pouvez toujours avoir acces a la version anglaise de ce document
en utilisant la commande << man -L C <section> <page_de_man> >>.