Rechercher une page de manuel

Chercher une autre page de manuel:

sigaction

Autres langues

Langue: fr

Version: 15 septembre 2005 (ubuntu - 01/11/07)

Section: 2 (Appels système)

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, et mise à disposition sur http://manpagesfr.free.fr/.

Les mises à jour et corrections de la version présente dans Debian sont directement gérées par Julien Cristau <jcristau@debian.org> et l'équipe francophone de traduction de Debian.

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> ».

La loi est l'expression de la volonté générale. Tous les citoyens ont
droit de concourir personnellement ou par leurs représentants à sa
formation.
-+- Déclaration des droits de l'homme et du citoyen
(26 août 1789) - Article VI -+-