Man page - rt_sigaction(2)

Packages contains this manual

Available languages:

en fr pl nl ja ru de

Manual

sigaction

NOM
BIBLIOTHÈQUE
SYNOPSIS
DESCRIPTION
Le paramĂštre siginfo_t vers un gestionnaire SA_SIGINFO
Le champ si_code
Sondage dynamique de la prise en charge des bits de drapeau
VALEUR RENVOYÉE
ERREURS
VERSIONS
Différences entre bibliothÚque C et noyau
STANDARDS
HISTORIQUE
NOTES
Non documenté
BOGUES
EXEMPLES
Sondage de la prise en charge d’un drapeau
VOIR AUSSI
TRADUCTION

NOM

sigaction, rt_sigaction - Examiner et modifier l’action associĂ©e Ă  un signal

BIBLIOTHÈQUE

BibliothĂšque C standard ( libc , -lc )

SYNOPSIS

#include <signal.h>

int sigaction(int signum ,
const struct sigaction *_Nullable restrict
act ,
struct sigaction *_Nullable restrict
oldact );

Exigences de macros de test de fonctionnalités pour la glibc (consulter feature_test_macros (7)) :

sigaction () :
_POSIX_C_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 .

Le champ sa_restorer n’est pas conçu pour une utilisation dans une application (POSIX ne spĂ©cifie pas de champ sa_restorer ). Vous pouvez trouver plus de dĂ©tails sur l’objectif de ce champ dans sigreturn (2).

sa_handler indique l’action à associer à signum et il peut s’agir d’une des suivantes :

-

SIG_DFL pour l’action par dĂ©faut.

-

SIG_IGN pour ignorer ce signal.

-

Un pointeur vers une fonction de gestion de signal. Cette fonction reçoit le numéro du signal comme seul paramÚtre.

Si SA_SIGINFO est indiqué dans sa_flags , sa_sigaction (et non sa_handler ) indique la fonction de gestion de signal dans signum . Cette fonction reçoit trois paramÚtres, comme décrit ci-dessous.

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 l’enfant reçoit un signal SIGSTOP , SIGTSTP , SIGTTIN ou SIGTTOU ) ou de relance (quand il reçoit SIGCONT ) des processus enfant. 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 enfants 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 enfant 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 ajouter le signal au masque de signal du thread pendant l’exĂ©ution du gestionnaire, sauf si le signal est indiquĂ© dans act.sa_mask . Par consĂ©quent, une prochaine instance du signal pourra ĂȘtre dĂ©livrĂ©e au thread pendant qu’il exĂ©cute le gestionnaire. Ce drapeau n’a de sens que lorsqu’on met en place un gestionnaire de signal.

SA_NOMASK est un synonyme obsolĂšte et non standard de ce drapeau.

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 de ce drapeau.

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_RESTORER

N’est pas conçu pour ĂȘtre utilisĂ© dans une application. Ce drapeau est utilisĂ© par les bibliothĂšques C pour indiquer que le champ sa_restorer contient l’adresse d’un « trampoline de signal ». Consultez sigreturn (2) pour plus de dĂ©tails.

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.

SA_UNSUPPORTED (depuis Linux 5.11)

Utilisé pour sonder de maniÚre dynamique la prise en charge des bits de drapeau.

Si un essai d’enregistrement de gestionnaire rĂ©ussit alors que ce drapeau est positionnĂ© sur act->sa_flags parmi d’autres drapeaux potentiellement non pris en charge par le noyau, et si un appel sigaction () immĂ©diatement consĂ©cutif indiquant un numĂ©ro de signal et ayant un paramĂštre oldact non NULL aboutit Ă  un clear SA_UNSUPPORTED dans oldact->sa_flags , oldact->sa_flags peut ĂȘtre utilisĂ© comme masque de bit dĂ©crivant les drapeaux potentiellement non pris en charge qui sont en rĂ©alitĂ© gĂ©rĂ©s. Consultez la section « Sonder dynamiquement la prise en charge de bits de drapeau » ci-dessous pour plus de dĂ©tails.

SA_EXPOSE_TAGBITS (depuis Linux 5.11)

Normalement, lorsqu’un signal est dĂ©livrĂ©, un jeu de bits d’étiquettes spĂ©cifique Ă  l’architecture est vidĂ© depuis le champ si_addr de siginfo_t . Si ce drapeau est positionnĂ©, un sous-ensemble de bits d’étiquette spĂ©cifique Ă  l’architecture sera conservĂ© dans si_addr .

Les programmes qui doivent ĂȘtre compatibles avec des versions de Linux supĂ©rieures Ă  la 5.11 doivent utiliser SA_UNSUPPORTED pour tester la prise en charge.

Le paramĂštre siginfo_t vers un gestionnaire SA_SIGINFO

Quand le drapeau SA_SIGINFO est indiquĂ© Ă  act.sa_flags , l’adresse du gestionnaire de signal est passĂ©e Ă  l’aide du champ act.sa_sigaction . Ce gestionnaire prend trois paramĂštres comme suit :

void
handler(int sig, siginfo_t *info, void *ucontext)
{
...
}

Ces trois paramĂštres sont comme suit

sig

Le numĂ©ro de signal qui a provoquĂ© l’appel du gestionnaire.

info

Un pointeur vers un siginfo_t , qui est une structure contenant plus d’informations sur le signal comme dĂ©crit ci-dessous.

ucontext

Il s’agit d’un pointeur vers une structure ucontext_t , diffusĂ©e sur void\ * . La structure vers laquelle pointe ce champ contient des informations contextuelles sur le signal sauvegardĂ©es dans la pile de l’espace utilisateur par le noyau ; pour des dĂ©tails, consultez sigreturn (2). Vous pouvez trouver plus d’informations sur la structure ucontext_t dans getcontext (3) et signal (7). GĂ©nĂ©ralement, la fonction de gestionnaire n’utilise pas le troisiĂšme paramĂštre.

Le type de données siginfo_t est une structure contenant les champs 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é */
union sigval si_value; /* Valeur du 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) */
void *si_lower; /* Limite infĂ©rieure lorsqu’une violation
d’adresse se produit (depuis Linux 3.19) */
void *si_upper; /* Limite supĂ©rieure lorsqu’une violation
d’adresse se produit (depuis Linux 3.19) */
int si_pkey; /* ClĂ© de protection PTE Ă  l’origine de
l’ereur (depuis Linux 4.6) */
void *si_call_addr; /* Adresse de l’instruction d’appel systùme
(depuis Linux 3.5) */
int si_syscall; /* Nombre d’appels systĂšme essayĂ©s
(depuis Linux 3.5) */
unsigned int si_arch; /* Architecture des appels systÚme essayés
(depuis Linux 3.5) */
}

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 enfants. Le champ si_pid est l’identifiant de processus de l’enfant ; si_uid est l’identifiant d’utilisateur rĂ©el de l’enfant. Le champ si_status contient le code de sortie de l’enfant (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 enfant ; ces champs ne comprennent pas le temps utilisĂ© par les enfants lorsqu’ils sont attendus (au contraire de getrusage (2) et times (2)). Jusqu’à Linux 2.6, et depuis Linux 2.6.27, ces champs renvoient le temps CPU en unitĂ© de sysconf(_SC_CLK_TCK) . Dans les noyaux Linux 2.6, avant Linux 2.6.27, un bogue faisait que ces champs renvoyaient des temps mesurĂ©s en jiffy systĂšme (configurable) (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 sous-erreurs de SIGBUS , en particulier BUS_MCEERR_AO et BUS_MCEERR_AR , remplissent Ă©galement si_addr_lsb . Ce champ indique le bit le moins significatif de l’adresse signalĂ©e et, donc, l’étendue de la corruption. Par exemple, si toute une page est corrompue, si_addr_lsb contient log2(sysconf(_SC_PAGESIZE)) . Lorsque SIGTRAP est dĂ©livrĂ© en rĂ©ponse Ă  un Ă©vĂ©nement ptrace (2) ((PTRACE_EVENT_foo), si_addr n’est pas peuplĂ© mais si_pid et si_uid le sont avec leur identifiant de processus et d’utilisateur respectifs responsables de cette trappe. Dans le cas de seccomp (2), le traceur sera affichĂ© comme dĂ©livrant un Ă©vĂ©nement. BUS_MCEERR_* et si_addr_lsb sont des extensions spĂ©cifiques Ă  Linux.

La sous-erreur de SEGV_BNDERR de SIGSEGV peuple si_lower et si_upper .

La sous-erreur SEGV_PKUERR de SIGSEGV peuple si_pkey .

-

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. Pour plus de dĂ©tails, voir la description de F_SETSIG dans fcntl (2).

-

SIGSYS , gĂ©nĂ©rĂ© (depuis Linux 3.5) quand un filtre seccomp renvoie SECCOMP_RET_TRAP , remplit si_call_addr , si_syscall , si_arch , si_errno et d’autres dĂ©crits dans seccomp (2).

Le champ si_code

Le champ si_code du paramĂštre siginfo_t passĂ© Ă  un gestionnaire de signal SA_SIGINFO est une valeur (et non un masque de bit) indiquant la raison de l’envoi de ce signal. Pour un Ă©vĂ©nement ptrace (2), si_code contiendra SIGTRAP et aura l’évĂ©nement ptrace dans l’octet fort :

(SIGTRAP | PTRACE_EVENT_foo << 8).

Pour un Ă©vĂ©nement non ptrace (2), les valeurs qui peuvent apparaĂźtre dans si_code sont dĂ©crites dans le reste de cette section. Depuis la glibc 2.20, les dĂ©finitions de la plupart de ces symboles viennent de <signal.h> en dĂ©finissant des macros de test de fonctionnalitĂ©s (avant l’inclusion de tout fichier d’en-tĂȘte) comme suit :

-

_XOPEN_SOURCE avec la valeur 500 ou supérieure ;

-

_XOPEN_SOURCE et _XOPEN_SOURCE_EXTENDED ; ou

-

_POSIX_C_SOURCE avec la valeur 200809L ou supérieure.

Pour les constantes TRAP_* , les dĂ©finitions de symboles ne sont fournies que dans les deux premiers cas. Avant la glibc 2.20, aucune macro de test n’était nĂ©cessaire pour obtenir ces symboles.

Pour un signal normal, 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 (depuis Linux 2.6.6)

Changement d’état d’une file de messages ; voir mq_notify (3).

SI_ASYNCIO

Fin d’une AIO.

SI_SIGIO

SIGIO avec file d’attente (seulement jusqu’à Linux 2.2 ; Ă  partir de Linux 2.4, SIGIO / SIGPOLL remplit si_code de la façon dĂ©crite plus bas).

SI_TKILL (depuis Linux 2.4.19)

tkill (2) ou tgkill (2).

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.

SEGV_BNDERR (depuis Linux 3.19)

VĂ©rification des limites de l’adresse Ă©chouĂ©e.

SEGV_PKUERR (depuis Linux 4.6)

AccĂšs interdit par des clĂ©s de protection de la mĂ©moire. Consultez pkeys (7). La clĂ© de protection applicable Ă  cet accĂšs est disponible Ă  l’aide de si_pkey .

Les valeurs suivantes peuvent ĂȘtre prises par si_code pour un signal SIGBUS :

BUS_ADRALN

alignement d’adresse non valable.

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

trappe dans le suivi d’exĂ©cution du processus.

TRAP_BRANCH (depuis Linux 2.4, IA64 seulement)

trappe dans le suivi des branches prises par le processus.

TRAP_HWBKPT (depuis Linux 2.4, IA64 seulement)

point d’arrĂȘt/point Ă  surveiller matĂ©riels.

Les valeurs suivantes peuvent ĂȘtre prises par si_code pour un signal SIGCHLD :

CLD_EXITED

enfant terminé normalement.

CLD_KILLED

enfant tué par un signal.

CLD_DUMPED

enfant terminé anormalement.

CLD_TRAPPED

l’enfant en cours de suivi a une trappe.

CLD_STOPPED

L’enfant s’est arrĂȘtĂ©.

CLD_CONTINUED (depuis Linux 2.6.9)

l’enfant arrĂȘtĂ© a redĂ©marrĂ©.

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

Les valeurs suivantes peuvent ĂȘtre prises par si_code pour un signal SIGSYS :

SYS_SECCOMP (depuis Linux 3.5)

Différé par une rÚgle de filtrage seccomp (2).

Sondage dynamique de la prise en charge des bits de drapeau

L’appel sigaction () sur Linux accepte des jeux de bits inconnus act->sa_flags sans erreur. Le comportement du noyau, Ă  partir de Linux 5.11, est qu’un deuxiĂšme sigaction (2) videra les bits inconnus de oldact->sa_flags . Toutefois, historiquement, un second appel sigaction () laissait gĂ©nĂ©ralement ces ensembles de bits dans oldact->sa_flags .

Cela signifie que la prise en charge de nouveaux drapeaux ne peut pas ĂȘtre dĂ©tectĂ©e par un simple test du drapeau sa_flags dans sa_flags et un programme doit tester que SA_UNSUPPORTED a Ă©tĂ© vidĂ© avant de s’appuyer sur le contenu de sa_flags .

Comme le comportement du gestionnaire ne peut pas ĂȘtre garanti, sauf si la vĂ©rification rĂ©ussit, il vaut mieux soit bloquer le signal concernĂ© tout en enregistrant le gestionnaire puis effectuer la vĂ©rification dans ce cas, soit, quand cela n’est pas possible, par exemple si le signal est synchrone, effectuer le deuxiĂšme sigaction () dans le gestionnaire de signal lui-mĂȘme.

Dans les noyaux qui ne prennent pas en charge un drapeau en particulier, le comportement du noyau est le mĂȘme que si le drapeau n’était pas positionnĂ©, mĂȘme si ce dernier a Ă©tĂ© positionnĂ© avec act->sa_flags .

Les drapeaux SA_NOCLDSTOP , SA_NOCLDWAIT , SA_SIGINFO , SA_ONSTACK , SA_RESTART , SA_NODEFER , SA_RESETHAND et, s’il est dĂ©fini par l’architecture, SA_RESTORER , peuvent ne pas ĂȘtre sondĂ©s de maniĂšre fiable si on utilise ce mĂ©canisme, parce qu’ils ont Ă©tĂ© introduits avant Linux 5.11. Cependant, en gĂ©nĂ©ral, les programmes peuvent supposer que ces drapeaux sont pris en charge car ils le sont depuis Linux 2.6, publiĂ© en 2003.

Consultez les EXEMPLES ci-dessous pour une dĂ©monstration de l’utilisation de SA_UNSUPPORTED .

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 non valable est indiquĂ©. Cela 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.

VERSIONS

Différences entre bibliothÚque C et noyau

La fonction enveloppe de la glibc autour de sigacttion () donne une erreur ( EINVAL ) lorsqu’on essaie de changer la position des deux signaux en temps rĂ©el utilisĂ©s en interne par l’implĂ©mentation de threading de NPTL. Consultez nptl (7) pour plus de dĂ©tails.

Sur des architectures oĂč le trampoline du signal se trouve dans la bibliothĂšque C, la fonction enveloppe de la bibliothĂšque C autour de sigaction () met l’adresse du code de trampoline dans le champ act.sa_restorer et positionne le drapeau SA_RESTORER du champ act.sa_flags . Consultez sigreturn (2).

L’appel systĂšme Linux d’origine s’appelait sigaction (). Toutefois, avec l’arrivĂ©e des signaux en temps rĂ©el dans Linux 2.2 et de la taille figĂ©e, le type sigset_t 32 bits pris en charge par cet appel systĂšme ne convenait plus Ă  cet objectif. Par consĂ©quent, un nouvel appel systĂšme rt_sigaction () a Ă©tĂ© ajoutĂ© pour prendre en charge le type sigset_t Ă©largi. Le nouvel appel systĂšme prend un quatriĂšme paramĂštre, size_t sigsetsize , qui indique la taille en octets des jeux de signal dans act.sa_mask et oldact.sa_mask . Ce paramĂštre est actuellement nĂ©cessaire pour obtenir la valeur sizeof(sigset_t) (ou le rĂ©sultat de l’erreur EINVAL ). La fonction enveloppe sigaction () de la glibc nous cache ces dĂ©tails en appelant de maniĂšre transparente rt_sigaction () quand le noyau le fournit.

STANDARDS

POSIX.1-2008.

HISTORIQUE

POSIX.1-2001, SVr4.

POSIX.1-1990 interdisait de positionner 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, si bien que la seule mĂ©thode complĂštement portable pour s’assurer que les enfants 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_NODEFER , SA_ONSTACK , SA_RESETHAND , SA_RESTART et SA_SIGINFO comme extensions XSI. POSIX.1-2008 a dĂ©placĂ© SA_NODEFER , SA_RESETHAND , SA_RESTART et SA_SIGINFO dans les spĂ©cifications de base. 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.

Le drapeau SA_NODEFER est compatible avec le drapeau 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 qu’on est en train de mettre en place (Ă©crasant de fait sa_mask ).

NOTES

Un enfant créé par fork (2) hĂ©rite d’une copie des actions des signaux de son parent. Lors d’un execve (2), les actions des signaux pris en charge sont remises aux valeurs par dĂ©faut ; les actions 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 .

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-safety (7) pour une liste de fonctions sĂ»res pour les signaux asynchrones qui peuvent ĂȘtre appelĂ©es dans un gestionnaire de signal.

Non documenté

Avant l’introduction de l’attribut SA_SIGINFO il Ă©tait dĂ©jĂ  possible d’obtenir des informations supplĂ©mentaires sur un signal. Cela se faisait en fournissant au gestionnaire de signal sa_handler un second paramĂštre de type struct sigcontext , qui est la mĂȘme structure que celle fournie dans le champ uc_mcontext de la structure ucontext passĂ©e (Ă  l’aide d’un pointeur) comme troisiĂšme paramĂštre du gestionnaire sa_sigaction Consultez les sources du noyau Linux pertinentes pour des dĂ©tails. Cette utilisation est dĂ©sormais obsolĂšte.

BOGUES

Au moment oĂč un signal est dĂ©livrĂ© avec le gestionnaire SA_SIGINFO , le noyau ne fournit pas toujours des valeurs significatives pour tous les champs de siginfo_t cohĂ©rentes pour ce signal.

Jusqu’à Linux 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.

EXEMPLES

Consultez mprotect (2).

Sondage de la prise en charge d’un drapeau

Le programme d’exemple suivant quitte avec l’état EXIT_SUCCESS si SA_EXPOSE_TAGBITS a vocation Ă  ĂȘtre pris en charge, ou sinon EXIT_FAILURE .

#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
void
handler(int signo, siginfo_t *info, void *context)
{
struct sigaction oldact;
if (sigaction(SIGSEGV, NULL, &oldact) == -1
|| (oldact.sa_flags & SA_UNSUPPORTED)
|| !(oldact.sa_flags & SA_EXPOSE_TAGBITS))
{
_exit(EXIT_FAILURE);
}
_exit(EXIT_SUCCESS);
}
int
main(void)
{
struct sigaction act = { 0 };
act.sa_flags = SA_SIGINFO | SA_UNSUPPORTED | SA_EXPOSE_TAGBITS;
act.sa_sigaction = &handler;
if (sigaction(SIGSEGV, &act, NULL) == -1) {
perror("sigaction");
exit(EXIT_FAILURE);
}
raise(SIGSEGV);
}

VOIR AUSSI

kill (1), kill (2), pause (2), pidfd_send_signal (2), restart_syscall (2), seccomp (2), sigaltstack (2), signal (2), signalfd (2), sigpending (2), sigprocmask (2), sigreturn (2), sigsuspend (2), wait (2), killpg (3), raise (3), siginterrupt (3), sigqueue (3), sigsetops (3), sigvec (3), core (5), signal (7)

TRADUCTION

La traduction française de cette page de manuel a été créée par Christophe Blaess <https://www.blaess.fr/christophe/>, Stéphan Rafin <stephan.rafin@laposte.net>, Thierry Vignaud <tvignaud@mandriva.com>, François Micaux, Alain Portal <aportal@univ-montp2.fr>, Jean-Philippe Guérard <fevrier@tigreraye.org>, Jean-Luc Coulon (f5ibh) <jean-luc.coulon@wanadoo.fr>, Julien Cristau <jcristau@debian.org>, Thomas Huriaux <thomas.huriaux@gmail.com>, Nicolas François <nicolas.francois@centraliens.net>, Florentin Duneau <fduneau@gmail.com>, Simon Paillard <simon.paillard@resel.enst-bretagne.fr>, Denis Barbier <barbier@debian.org>, David Prévot <david@tilapin.org>, Cédric Boutillier <cedric.boutillier@gmail.com>, Frédéric Hantrais <fhantrais@gmail.com> et Jean-Philippe MENGUAL <jpmengual@debian.org>

Cette traduction est une documentation libre ; veuillez vous reporter à la GNU General Public License version 3 concernant les conditions de copie et de distribution. Il n’y a aucune RESPONSABILITÉ LÉGALE.

Si vous découvrez un bogue dans la traduction de cette page de manuel, veuillez envoyer un message à debian-l10n-french@lists.debian.org .