Date création : 27-03-2008 20:23:44
 Vous êtes dans : GNU/Linux Astuces / Pages man [Section2 - Appels système]
SIGACTION
Index
- NOM
- SYNOPSIS
- DESCRIPTION
- VALEUR RENVOYÉE
- ERREURS
- NOTES
- BOGUES
- CONFORMITÉ
- NON DOCUMENTÉ
- VOIR AUSSI
- TRADUCTION
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);
DESCRIPTION
L'appel système sigaction() sert à modifier l'action effectuée par un
processus à la réception d'un signal spécifique.
signum indique le signal concerné, à l'exception de SIGKILL et
SIGSTOP.
Si act est non nul, la nouvelle action pour le signal signum est
définie par act. Si oldact est non nul, 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 doit 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 argument.
sa_mask fournit un masque de signaux à bloquer 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 gestionnaire de signaux. 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. Voir wait(2).
- SA_NOCLDWAIT
-
(À partir de Linux 2.6) Si signum est SIGCHLD, ne pas transformer les
fils en zombies quand ils se terminent. Voir également waitpid(2).
- SA_RESETHAND
-
Rétablir l'action à son comportement par défaut une fois que le gestionnaire
a été appelé. SA_ONESHOT 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.
- SA_RESTART
-
Fournir un comportement compatible avec la sémantique BSD en redémarrant
automatiquement les appels systèmes lents interrompus par l'arrivée du
signal.
- SA_NODEFER
-
Ne pas empêcher un signal d'être reçu depuis l'intérieur de son propre
gestionnaire. SA_NOMASK est un synonyme obsolète et non standard pour cet
attribut.
- SA_SIGINFO
-
Le gestionnaire de signal recevra trois arguments, et non plus un seul. Dans
ce cas, il faut utiliser le membre sa_sigaction (apparu dans Linux
2.1.86.) et non pas sa_handler.
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 */
pid_t si_pid; /* PID de l'émetteur */
uid_t si_uid; /* UID réel de l'émetteur */
int si_status; /* Valeur de sortie */
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 */
void * si_addr; /* Emplacement d'erreur */
int si_band; /* Événement « Band » */
int si_fd; /* Descripteur de fichier */
}
Les champs si_signo, si_errno and si_code sont définis pour tous
les signaux (si_signo n'est pas utilisé sous Linux). Le reste de la
structure peut être une union, et il ne faut donc tenir compte que des
champs qui sont significatifs pour le signal reçu. Les signaux POSIX.1b et
SIGCHLD remplissent les champs si_pid et si_uid. SIGCHLD remplit
aussi si_status, si_utime et si_stime. si_int et si_ptr sont
fournis par l'émetteur d'un signal POSIX.1b. SIGILL, SIGFPE,
SIGSEGV et SIGBUS remplissent si_addr avec l'adresse de
l'erreur. SIGPOLL remplit si_band et si_fd.
si_code indique la raison pour laquelle le signal a été émis. Il s'agit
d'une valeur, pas d'un masque de bits. Les valeurs possibles pour tous les
signaux sont :
si_code
|
| Valeur | Origine du signal
|
| SI_USER | kill(), sigsend() ou raise()
|
| SI_KERNEL | Noyau
|
| SI_QUEUE | sigqueue()
|
| SI_TIMER | Fin d'une temporisation POSIX
|
| SI_MESGQ | Changement d'état d'une file de messages (depuis Linux 2.6.6)
|
| SI_ASYNCIO | Fin d'une AIO
|
| SI_SIGIO | SIGIO empilé
|
| SI_TKILL | tkill() ou tgkill() (depuis Linux 2.4.19)
|
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
|
SIGFPE
|
| FPE_INTDIV | division entière par zéro
|
| FPE_INTOVF | débordement entier
|
| FPE_FLTDIV | division réelle par zéro
|
| FPE_FLTOVF | débordement réel
|
| FPE_FLTUND | débordement inférieur réel
|
| FPE_FLTRES | résultat réel inexact
|
| FPE_FLTINV | opération réelle invalide
|
| FPE_FLTSUB | indice hors intervalle
|
SIGSEGV
|
| SEGV_MAPERR | adresse sans objet
|
| SEGV_ACCERR | permissions invalides
|
SIGBUS
|
| BUS_ADRALN | alignement d'adresse invalide
|
| BUS_ADRERR | adresse physique inexistante
|
| BUS_OBJERR | erreur matérielle spécifique
|
SIGTRAP
|
| TRAP_BRKPT | point d'arrêt du processus
|
| TRAP_TRACE | suivi d'exécution du processus
|
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)
|
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, 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 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.
NOTES
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() ou raise(). 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 (voir wait(2)). Cependant, les comportements historiques de BSD
et de Système 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.
La gestion de SA_SIGINFO a été ajoutée dans Linux 2.2.
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 nul 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 nuls.
Il est impossible de bloquer SIGKILL or SIGSTOP (en les indiquant dans
sa_mask). Les tentatives seront ignorées silencieusement.
Voir sigsetops(3) pour les détails concernant les ensembles de signaux.
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.
CONFORMITÉ
POSIX.1-2001, SVr4.
NON DOCUMENTÉ
Avant l'introduction de l'attribut SA_SIGINFO il était déjà possible
d'obtenir des informations supplémentaires dans le gestionnaire de signal,
en lui ajoutant un argument de type struct sigcontext. On peut retrouver
ceci dans les sources du noyau. Ce mécanisme est désormais obsolète.
VOIR AUSSI
kill(1), kill(2), pause(2), sigaltstack(2), signal(2),
sigpending(2), sigprocmask(2), sigqueue(2), sigsuspend(2),
wait(2), killpg(3), raise(3), siginterrupt(3), sigsetops(3),
sigvec(3), core(5), signal(7)
TRADUCTION
Cette page de manuel a été traduite et mise à jour par
Christophe Blaess <http://www.blaess.fr/christophe/> entre 1996 et 2003,
puis par Alain Portal <aportal AT univ-montp2 DOT fr> jusqu'en 2006.
La traduction de cette page de manuel est basée sur les traductions
disponibles sur http://manpagesfr.free.fr/,
mais est gérée par l'équipe francophone de traduction de Debian
au travers de la liste de discussion debian-l10n-french.
Veuillez signaler toute erreur de traduction 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> ».
|