SIGACTION

Section: Manuel du programmeur Linux (2)
Updated: 18 juillet 2003
Index


NOM
SYNOPSIS
DESCRIPTION
VALEUR RENVOYÉE
ERREURS
NOTES
CONFORMITÉ
NON DOCUMENTÉ
VOIR AUSSI
TRADUCTION

NOM

sigaction, sigprocmask, sigpending, sigsuspend - Fonctions POSIX de manipulations de signaux.

SYNOPSIS

#include <signal.h>
int sigaction (int signum, const struct sigaction * act, struct sigaction *oldact);
int sigprocmask (int how, const sigset_t * set, sigset_t * oldset);
int sigpending (sigset_t * set);
int sigsuspend (const sigset_t * mask);

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.
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 les attributs SA_NODEFER ou SA_NOMASK soient précisés.
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 d'un processus fils (quand le fils reçoit un signal SIGSTOP, SIGTSTP, SIGTTIN ou SIGTTOU).
SA_ONESHOT ou SA_RESETHAND
Rétablir l'action à son comportement par défaut une fois que le gestionnaire a été appelé.
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_NOMASK ou SA_NODEFER
Ne pas empêcher un signal d'être reçu depuis l'intérieur de son propre gestionnaire.
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;        /* Band event               */
        int     si_fd;          /* Descripteur de fichier   */
}
Les champs si_signo, si_errno and si_code sont définis pour tous les signaux. 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. L'appel-système kill(2), les signaux Posix.1b et SIGCHLD remplissent les champs si_pid et si_uid. SIGCHLDremplitaussi 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
ValeurOrigine du signal
SI_USERkill, sigsend ou raise
SI_KERNELNoyau
SI_QUEUEsigqueue
SI_TIMERFin d'une temporisation
SI_MESGQChangement d'état mesq
SI_ASYNCIOFin d'une AIO
SI_SIGIOSIGIO empilé

SIGILL
ILL_ILLOPCopcode illégal
ILL_ILLOPNopérande illégale
ILL_ILLADRmode 'dadressage illégal
ILL_ILLTRPtrappe illégale
ILL_PRVOPCopcode priviliégié
ILL_PRVREGregistre privilégié
ILL_COPROCerreur de coprocesseur
ILL_BADSTKerreur interne de pile

SIGFPE
FPE_INTDIVdivision entière par zéro
FPE_INTOVFdébordement entier
FPE_FLTDIVdivision réelle par zéro
FPE_FLTOVFdébordement réel
FPE_FLTUNDdébordement inférieur réel
FPE_FLTRESrésultat réel inexact
FPE_FLTINVopération réelle invalide
FPE_FLTSUBindice hors intervalle

SIGSEGV
SEGV_MAPERRadresse sans objet
SEGV_ACCERRpermissions invalides

SIGBUS
BUS_ADRALNalignement d'adresse invalide
BUS_ADRERRadresse physique inexistante
BUS_OBJERRerreur matérielle spécifique

 
SIGTRAP
TRAP_BRKPTpoint d'arrêt du processus
TRAP_TRACEsuivi d'exécution du processus

SIGCHLD
CLD_EXITEDfils terminé normalement
CLD_KILLEDfils tué par un signal
CLD_DUMPEDfils terminé anormalement
CLD_TRAPPEDfils en cours de suivi
CLD_STOPPEDfils arrêté
CLD_CONTINUEDfils arrêté a redémarré

SIGPOLL
POLL_INdonnées disponibles en entrée
POLL_OUTbuffers de sortie libres
POLL_MSGmessage disponible en entrée
POLL_ERRerreur d'entrée/sortie
POLL_PRIentrée haute priorité disponible
POLL_HUPpériphérique débranché


L'appel sigprocmask est utilisé pour changer la liste des signaux actuellement bloqués. Son comportement est dépendant de la valeur de how, avec les conventions suivantes :
SIG_BLOCK
L'ensemble des signaux bloqués est l'union de l'ensemble actuel et de l'argument set.
SIG_UNBLOCK
Les signaux dans l'ensemble set sont supprimés de la liste des signaux bloqués. Il est possible de débloquer un signal non bloqué.
SIG_SETMASK
L'ensemble des signaux bloqués est égal à l'argument set.

Si oldset est non nul, la valeur précédente du masque de signaux est stockée dans oldset.
L'appel sigpending permet l'examen des signaux en attente (qui se sont déclenchés en étant bloqués). Le masque de signaux en attente est stocké dans set.
L'appel sigsuspend remplace temporairement le masque de signaux bloqués par celui fourni dans mask puis endort le processus jusqu'à arrivée d'un signal.

VALEUR RENVOYÉE

sigaction, sigprocmask, et sigpending renvoient 0 s'ils réussissent, ou -1 s'ils échouent, auquel cas errno contient le code d'erreur. La fonction sigsuspend renvoit toujours -1, avec en principe l'erreur EINTR.

ERREURS

EINVAL
Un signal invalide est indiqué. Ceci se produit également si l'on tente de modifier l'action associée à SIGKILL ou SIGSTOP.
EFAULT
act, oldact, set, oldset ou mask pointent en-dehors de l'espace d'adressage accessible.
EINTR
L'appel système a été interrompu.

NOTES

Il est impossible de bloquer SIGKILL or SIGSTOP avec l'appel sigprocmask. Les tentatives seront ignorées silencieusement.
Suivant POSIX, le comportement d'un processus est indéfini après qu'il ait ignoré un signal SIGFPE, SIGILL, ou SIGSEGV qui n'avait 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, cela déclenchera un signal SIGFPE. (De même diviser l'entier le plus négatif par -1 peut déclencher SIGFPE). Ignorer ce signal peut mener à des boucles sans fin.
POSIX (B.3.3.1.3) désapprouve le positionnement de SIGCHLD à SIG_IGN. Les comportements BSD et SYSV diffèrent, faisant échouer sous Linux les logiciels BSD qui positionne l'action de SIGCHLD à SIG_IGN.
Les spécifications POSIX définissent seulement SA_NOCLDSTOP. L'utilisation des autres options de sa_flags n'est pas portable.
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 ).
Les noms SA_RESETHAND et SA_NODEFER pour compatibilité avec SVr4 ne sont présents que dans les bibliothèques 3.0.9 et suivantes.
L'attribut SA_SIGINFO est précisé par POSIX.1b. Son support fut ajouté dans Linux 2.2.
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'appellant avec les deuxième et troisième arguments nuls.
Voir sigsetops(3) pour les détails concernant les ensembles de signaux.

CONFORMITÉ

POSIX, SVr4. SVr4 ne documente pas la condition d'erreur EINTR.

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), killpg(2), pause(2), sigaltstack(2), raise(3), siginterrupt(3), signal(2), signal(7), sigsetops(3), sigvec(2)

TRADUCTION

Christophe Blaess, 1996-2003.