signal(7) Miscellaneous Information Manual signal(7)
NOM
signal - Panorama des signaux
DESCRIPTION
Linux prend en charge a la fois les signaux POSIX classiques
(<< ci-apres signaux standard >>) et les signaux POSIX temps reel.
Action des signaux
Chaque signal a une action en vigueur qui determine le comportement du
processus lorsqu'il recoit ce signal.
Les elements de la colonne << Action >> indiquent l'action par defaut
pour chaque signal, avec la signification suivante :
Term Par defaut, terminer le processus.
Ign Par defaut, ignorer le signal.
Core Par defaut, terminer le processus et creer un fichier d'image
memoire (consultez core(5)).
Stop Par defaut, arreter le processus.
Cont Par defaut, continuer le processus s'il est actuellement arrete.
Un processus peut changer l'action d'un signal avec sigaction(2) ou
signal(2) (la deuxieme option est moins portable quand un gestionnaire
de signal est defini ; consultez signal(2) pour plus de details). Avec
ces appels systeme, un processus peut choisir de se comporter de l'une
des facons suivantes lorsqu'il recoit un signal : effectuer l'action
par defaut, ignorer le signal ou intercepter le signal avec un
gestionnaire de signal, c'est-a-dire une fonction definie par le
programme qui est invoquee automatiquement lorsque le signal est
transmis.
Par defaut, le gestionnaire de signal est appele sur la pile normale
des processus. Il est possible de prevoir que le gestionnaire de signal
utilise une autre pile ; consultez sigaltstack(2) pour une discussion
sur comment faire cela et quand cela pourrait etre utile.
L'action d'un signal est un attribut du processus : dans une
application multithreadee, l'action d'un signal particulier est la meme
pour tous les threads.
Un enfant cree par fork(2) herite 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 defaut ; les actions des signaux
ignores ne sont pas modifiees.
Envoyer un signal
Les appels systeme et les fonctions de bibliotheque qui suivent
permettent a l'appelant d'envoyer un signal :
raise(3)
Envoyer un signal au thread appelant.
kill(2)
Envoyer un signal au processus indique, a tous les membres du
groupe de processus indique ou a tous les processus du systeme.
pidfd_send_signal(2)
Envoyer un signal a un processus identifie par un descripteur de
fichier de PID.
killpg(3)
Envoyer un signal a tous les membres du groupe de processus
indique.
pthread_kill(3)
Envoyer un signal au thread POSIX indique dans le meme processus
que l'appelant.
tgkill(2)
Envoyer un signal au thread indique a l'interieur d'un processus
donne (c'est l'appel systeme utilise pour implementer
pthread_kill(3)).
sigqueue(3)
Envoyer un signal temps reel, avec ses donnees jointes, au
processus indique.
Attente de la capture d'un signal
Les appels systeme suivants suspendent l'execution du thread appelant
jusqu'a ce qu'un signal soit recu (ou qu'un signal non pris en charge
termine le processus) :
pause(2)
Suspendre l'execution jusqu'a ce que n'importe quel signal soit
recu.
sigsuspend(2)
Changer temporairement le masque de signaux (voir ci-dessous) et
suspendre l'execution jusqu'a ce qu'un des signaux non masque
soit recu.
Accepter un signal de facon synchrone
Au lieu d'intercepter un signal de facon asynchrone avec un
gestionnaire de signal, il est possible de l'accepter de facon
synchrone, c'est-a-dire de bloquer l'execution jusqu'a ce que le signal
soit distribue. A ce moment, le noyau renvoie des informations
concernant le signal a l'appelant. Il y a deux facons generales pour
faire cela :
- sigwaitinfo(2), sigtimedwait(2) et sigwait(3) suspendent l'execution
jusqu'a ce qu'un des signaux dans l'ensemble indique soit distribue.
Chacun de ces appels renvoie des informations concernant le signal
distribue.
- signalfd(2) renvoie un descripteur de fichier qui peut etre utilise
pour lire les informations concernant les signaux qui sont
distribues a l'appelant. Chaque read(2) dans ce descripteur de
fichier est bloquant jusqu'a ce que un des signaux de l'ensemble
indique dans l'appel signalfd(2) soit distribue a l'appelant. Le
tampon renvoye par read(2) contient une structure qui decrit le
signal.
Masque de signaux et signaux en attente
Un signal peut etre bloque, ce qui signifie qu'il ne sera pas envoye
avant d'etre debloque. Entre le moment de sa creation et celui de son
envoi, le signal est dit en attente.
Chaque thread d'un processus a un masque de signaux independant qui
indique l'ensemble des signaux bloques par le thread. Un thread peut
modifier son masque de signaux avec pthread_sigmask(3). Dans une
application traditionnelle a un seul thread, sigprocmask(2) peut etre
utilisee pour modifier le masque de signaux.
Un processus enfant cree avec fork(2) herite d'une copie du masque de
signaux de son parent. Le masque de signaux est conserve au travers
d'un execve(2).
Un signal peut etre << oriente processus >> ou << oriente thread >>. Un
signal oriente processus est un signal qui cible (et par consequent en
attente pour) le processus dans son entier. Il peut l'etre parce qu'il
a ete genere par le noyau pour des raisons autres qu'une exception
materielle ou parce qu'il a ete envoye en utilisant kill(2) ou
sigqueue(3). Un signal oriente thread est destine a un thread
particulier. Un tel signal peut l'etre parce qu'il a ete genere en
consequence de l'execution d'une instruction specifique de code machine
qui est declenchee par une exception materielle (par exemple, SIGSEGV
pour un acces memoire non autorise ou SIGFPE pour une erreur
mathematique) ou parce qu'il visait un thread particulier en utilisant
une interface telle que tgkill(2) ou pthread_kill(3).
Un signal oriente processus peut etre delivre a n'importe quel des
threads qui n'ont pas presentement le signal bloque. Si plus d'un des
threads a le signal non bloque, alors le noyau choisit un thread
arbitraire auquel delivrer le signal.
Un thread peut obtenir l'ensemble des signaux actuellement en attente
en utilisant sigpending(2). Cet ensemble est l'union de l'ensemble des
signaux en attente orientes processus et l'ensemble des signaux en
attente pour le thread appelant.
Un enfant cree avec fork(2) debute avec un ensemble de signaux en
attente vide. L'ensemble de signaux en attente est conserve au travers
d'un execve(2).
Execution des gestionnaires de signal
A chaque transition d'une execution en mode noyau vers une en mode
utilisateur (par exemple, lors du retour d'un appel systeme ou
l'ordonnancement d'un thread sur le CPU), le noyau verifie s'il existe
un signal en attente non bloque pour lequel le processus a etabli un
gestionnaire de signal. Si un tel signal est en attente, les etapes
suivantes se deroulent :
(1) Le noyau realise les etapes preparatoires necessaires pour
l'execution du gestionnaire de signal :
(1.1) Le signal est supprime de l'ensemble des signaux en
attente.
(1.2) Si le gestionnaire de signal a ete installe par un appel a
sigaction(2) qui est precise par l'indicateur SA_ONSTACK et
que le thread a defini une pile de signaux de remplacement
(en utilisant sigaltstack(2)), alors cette pile est
installee.
(1.3) Diverses pieces du contexte relatif au signal sont
enregistrees dans une structure speciale qui est creee dans
la pile. Les informations enregistrees comprennent :
- le registre de compteur du programme (c'est-a-dire
l'adresse de la prochaine instruction dans le programme
principal qui devrait etre executee lors du renvoi du
gestionnaire de signal) ;
- l'etat du registre specifique a l'architecture
necessaire pour reprendre le programme interrompu ;
- le masque de signaux du thread actuel ;
- les parametres de la pile de signaux de remplacement du
thread.
(Si le gestionnaire de signal a ete installe en utilisant
l'indicateur SA_SIGINFO de sigaction(2), alors les
informations ci-dessus sont accessibles a l'aide de l'objet
ucontext_t qui est pointe par le troisieme argument du
gestionnaire de signal.)
(1.4) Tout signal precise dans act->sa_mask lors de
l'enregistrement du gestionnaire avec sigprocmask(2) est
ajoute au masque de signaux du thread. Le signal a
transmettre est aussi ajoute au masque de signaux a moins
que SA_NODEFER ait ete precise lors de l'enregistrement du
gestionnaire. Ces signaux sont alors bloques pendant que le
gestionnaire realise l'execution.
(2) Le noyau construit une structure pour le gestionnaire de signal
sur la pile. Le noyau regle le compteur du programme pour le
thread pour pointer a la premiere instruction de la fonction du
gestionnaire de signal et configure l'adresse de retour pour cette
fonction pour pointer vers un element du code de l'espace
utilisateur connu comme << trampoline de signal >> (decrit dans
sigreturn(2)).
(3) Le noyau repasse le controle a l'espace utilisateur ou l'execution
commence au debut de la fonction du gestionnaire de signal.
(4) Au renvoi du gestionnaire de signal, le controle passe au
trampoline de signal.
(5) Le trampoline de signal appelle sigreturn(2), un appel systeme qui
utilise les informations dans la structure de la pile creee a la
premiere etape pour restaurer le thread dans son etat avant que le
gestionnaire de signal ait ete appele. Les parametres du masque de
signaux du thread et de la pile de signaux de remplacement sont
restaures dans le cadre de cette procedure. A la fin de l'appel a
sigreturn(2), le noyau transfere le controle a l'espace
utilisateur et le thread recommence l'execution a partir du point
ou elle a ete interrompue par le gestionnaire de signal.
Remarquez que si le gestionnaire de signal ne renvoie pas (par exemple,
le controle est transfere en dehors du gestionnaire en utilisant
siglongjmp(3) ou le gestionnaire execute un nouveau programme avec
execve(2)), alors l'etape finale n'est par realisee. En particulier,
dans de tels scenarios, c'est la responsabilite du programmeur de
restaurer l'etat du masque de signaux (en utilisant sigprocmask(2)) si
le deblocage des signaux, qui etaient bloques par une entree dans le
gestionnaire de signal, est desire. (Notez que siglongjmp(3) peut ou ne
peut pas restaurer le masque de signaux en fonction de la valeur
savesigs qui etait indiquee dans l'appel correspondant a sigsetjmp(3).)
Du point de vue du noyau, l'execution du code du gestionnaire de signal
est exactement la meme que celle n'importe quel code de l'espace
utilisateur. C'est-a-dire que le noyau n'enregistre aucune information
speciale d'etat indiquant que le thread est actuellement en execution a
l'interieur d'un gestionnaire de signal. Toutes les informations d'etat
necessaires sont entretenues dans des registres de l'espace utilisateur
et la pile de l'espace utilisateur. La profondeur a laquelle les
gestionnaires de signaux imbriques peuvent etre invoques est donc
limitee seulement par la pile de l'espace utilisateur (et une
conception logicielle raisonnable).
Signaux standard
Linux prend en charge les signaux standard listes ci-dessous. La
seconde colonne du tableau indique quelle norme (si elle existe) decrit
le signal : << P1990 >> indique que le signal est decrit dans la norme
POSIX.1-1990 originelle. << P2001 >> indique que le signal a ete ajoute
dans SUSv2 et POSIX.1-2001.
Signal Norme Action Commentaire
-----------------------------------------------------------------------------------
SIGABRT P1990 Core Signal d'arret d'abort(3)
SIGALRM P1990 Term Signal de temporisation d'alarm(2)
SIGBUS P2001 Core Erreur de bus (mauvais acces memoire)
SIGCHLD P1990 Ign Enfant arrete ou termine
SIGCLD - Ign Synonyme pour SIGCHLD
SIGCONT P1990 Cont Continuer si arrete
SIGEMT - Term Interception (trap) d'emulateur
SIGFPE P1990 Core Exception de virgule flottante
SIGHUP P1990 Term Deconnexion detectee sur le terminal de
controle ou mort du processus de controle
SIGILL P1990 Core Instruction illegale
SIGINFO - Synonyme pour SIGPWR
SIGINT P1990 Term Interruption depuis le clavier
SIGIO - Term E/S maintenant possible (4.2BSD)
SIGIOT - Core Interception IOT - synonyme pour SIGABRT
SIGKILL P1990 Term Signal d'arret
SIGLOST - Term Perte de verrou de fichier (inutilise)
SIGPIPE P1990 Term Tube brise : ecriture dans un tube sans
lecteur - voir pipe(7)
SIGPOLL P2001 Term Evenement scrutable (System V)
- synonyme pour SIGIO
SIGPROF P2001 Term Fin d'une temporisation de profilage
SIGPWR - Term Panne d'alimentation (System V)
SIGQUIT P1990 Core Quitter depuis le clavier
SIGSEGV P1990 Core Reference memoire non valable
SIGSTKFLT - Term Erreur de pile sur coprocesseur (inutilise)
SIGSTOP P1990 Stop Processus d'arret
SIGTSTP P1990 Stop Stop saisi sur le terminal
SIGSYS P2001 Core Mauvais appel systeme (SVr4)
- voir aussi seccomp(2)
SIGTERM P1990 Term Signal de fin
SIGTRAP P2001 Core Interception pour trace ou pour point d'arret
SIGTTIN P1990 Stop Entree du terminal pour processus en arriere-plan
SIGTTOU P1990 Stop Sortie du terminal pour processus en arriere-plan
SIGUNUSED - Core Synonyme pour SIGSYS
SIGURG P2001 Ign Condition urgente sur un socket (4.2BSD)
SIGUSR1 P1990 Term Signal utilisateur 1
SIGUSR2 P1990 Term Signal utilisateur 2
SIGVTALRM P2001 Term Horloge virtuelle d'alarme (4.2BSD)
SIGXCPU P2001 Core Limite de temps CPU depassee (4.2BSD)
Consultez setrlimit(2)
SIGXFSZ P2001 Core Taille de fichier excessive (4.2BSD)
Consultez setrlimit(2)
SIGWINCH - Ign Fenetre redimensionnee (4.3BSD, Sun)
Les signaux SIGKILL et SIGSTOP ne peuvent etre ni captures, ni bloques,
ni ignores.
Jusqu'a Linux 2.2 inclus, l'action par defaut pour SIGSYS, SIGXCPU,
SIGXFSZ et (sur les architectures autres que SPARC ou MIPS) SIGBUS
etait de terminer simplement le processus, sans fichier image memoire.
(Sur certains UNIX, l'action par defaut pour SIGXCPU et SIGXFSZ est de
finir le processus sans fichier image memoire.) Linux 2.4 se conforme a
POSIX.1-2001 pour ces signaux et termine le processus avec un fichier
image memoire.
SIGEMT n'est pas specifie par POSIX.1-2001 mais apparait neanmoins sur
la plupart des UNIX, avec une action par defaut typique correspondant a
une fin du processus avec fichier image memoire.
SIGPWR (non specifie dans POSIX.1-2001) est typiquement ignore sur les
autres UNIX ou il apparait.
SIGIO (non specifie par POSIX.1-2001) est ignore par defaut sur
plusieurs autres systemes UNIX.
Semantiques d'attente et de distribution pour les signaux standard
Si plusieurs signaux standard sont en attente pour un processus,
l'ordre dans lequel les signaux sont distribues n'est pas precise.
Les signaux standard ne sont pas mis en file d'attente. Si plusieurs
instances d'un signal standard sont generees pendant que ce signal est
bloque, alors une seule instance du signal est marquee comme en attente
(et le signal sera distribue une seule fois une fois debloque). Dans le
cas ou un signal standard est deja en attente, la structure siginfo_t
(consultez sigaction(2)) associee a ce signal n'est pas ecrasee lors de
l'arrivee d'instances suivantes du meme signal. Par consequent, le
processus recevra les informations associees a la premiere instance du
signal.
Numerotation pour les signaux standard
La valeur numerique de chaque signal est donnee dans la table
ci-dessous. Comme montres dans cette table, plusieurs signaux ont des
valeurs numeriques differentes sur des architectures differentes. La
premiere valeur dans chaque ligne indique le numero de signal sur x86,
ARM et la plupart des autres architectures. La seconde valeur indique
celui pour Alpha et SPARC. La troisieme indique celui de MIPS et la
derniere celui de PA-RISC. Un tiret (-) indique que le signal est
absent sur l'architecture correspondante.
Signal x86/ARM et la Alpha/ MIPS PA-RISC Notes
plupart des arch. SPARC
-------------------------------------------------------------------------
SIGHUP 1 1 1 1
SIGINT 2 2 2 2
SIGQUIT 3 3 3 3
SIGILL 4 4 4 4
SIGTRAP 5 5 5 5
SIGABRT 6 6 6 6
SIGIOT 6 6 6 6
SIGBUS 7 10 10 10
SIGEMT - 7 7 -
SIGFPE 8 8 8 8
SIGKILL 9 9 9 9
SIGUSR1 10 30 16 16
SIGSEGV 11 11 11 11
SIGUSR2 12 31 17 17
SIGPIPE 13 13 13 13
SIGALRM 14 14 14 14
SIGTERM 15 15 15 15
SIGSTKFLT 16 - - 7
SIGCHLD 17 20 18 18
SIGCLD - - 18 -
SIGCONT 18 19 25 26
SIGSTOP 19 17 23 24
SIGTSTP 20 18 24 25
SIGTTIN 21 21 26 27
SIGTTOU 22 22 27 28
SIGURG 23 16 21 29
SIGXCPU 24 24 30 12
SIGXFSZ 25 25 31 30
SIGVTALRM 26 26 28 20
SIGPROF 27 27 29 21
SIGWINCH 28 28 20 23
SIGIO 29 23 22 22
SIGPOLL Idem a SIGIO
SIGPWR 30 29/- 19 19
SIGINFO - 29/- - -
SIGLOST - -/29 - -
SIGSYS 31 12 12 31
SIGUNUSED 31 - - 31
Il est a noter que :
- si defini, SIGUNUSED est synonyme de SIGSYS. Depuis la glibc 2.26,
SIGUNUSED n'est plus defini sur toutes les architectures ;
- le signal 29 est SIGINFO/SIGPWR (synonymes pour la meme valeur) sur
Alpha mais SIGLOST sur SPARC.
Signaux temps reel
Starting with Linux 2.2, Linux supports real-time signals as originally
defined in the POSIX.1b real-time extensions (and now included in
POSIX.1-2001). The range of supported real-time signals is defined by
the macros SIGRTMIN and SIGRTMAX. POSIX.1-2001 requires that an
implementation support at least _POSIX_RTSIG_MAX (8) real-time signals.
Le noyau Linux gere une gamme de 33 signaux temps reel differents,
numerotes de 32 a 64. Cependant, l'implementation des threads POSIX de
la glibc utilise en interne deux (pour l'implementation NPTL) ou trois
(pour l'implementation LinuxThreads) signaux temps reel (consultez
pthreads(7)) et ajuste la valeur de SIGRTMIN en consequence (a 34 ou
35). Comme la gamme de signaux temps reel varie en fonction de
l'implementation des threads par la glibc (et cette implementation peut
changer a l'execution en fonction du noyau et de la glibc) et que la
gamme de signaux temps reel varie bien sur egalement suivant les
systemes UNIX, les programmes ne devraient jamais faire reference a des
signaux temps reel en utilisant des numeros codes en dur, mais
devraient toujours a la place utiliser des signaux temps reel avec la
notation SIGRTMIN+n avec des verifications adequates (lors de
l'execution) que SIGRTMIN+n ne depasse pas SIGRTMAX.
Contrairement aux signaux standard, les signaux temps reel n'ont pas de
signification predefinie : l'ensemble complet de ces signaux peut etre
utilise a des fins specifiques a l'application.
L'action par defaut pour un signal temps reel non gere est de terminer
le processus recepteur.
Les signaux temps reel se distinguent de la facon suivante :
- Plusieurs instances d'un signal temps reel peuvent etre mises en
file d'attente. Au contraire, si plusieurs instances d'un signal
standard arrivent alors qu'il est presentement bloque, une seule
instance sera mise en file d'attente.
- Si le signal est envoye en utilisant sigqueue(3), il peut etre
accompagne d'une valeur (un entier ou un pointeur). Si le processus
recepteur positionne un gestionnaire pour ce signal en utilisant
l'attribut SA_SIGINFO pour l'appel sigaction(2), alors il peut
acceder a la valeur transmise dans le champ si_value de la structure
siginfo_t passee en second argument au gestionnaire. De plus, les
champs si_pid et si_uid de cette structure fournissent le PID et
l'UID reel du processus emetteur du signal.
- Les signaux temps reel sont delivres dans un ordre precis. Les
divers signaux temps reel du meme type sont delivres dans l'ordre ou
ils ont ete emis. Si differents signaux temps reel sont envoyes au
processus, ils sont delivres en commencant par le signal de numero
le moins eleve (c'est-a-dire le signal de plus fort numero est celui
de priorite la plus faible). Par contre, si plusieurs signaux
standard sont en attente pour un processus, l'ordre dans lequel ils
sont delivres n'est pas defini.
Si des signaux standard et des signaux temps reel sont simultanement en
attente pour un processus, POSIX ne precise pas l'ordre de delivrance.
Linux, comme beaucoup d'autres implementations, donne priorite aux
signaux standard dans ce cas.
According to POSIX, an implementation should permit at least
_POSIX_SIGQUEUE_MAX (32) real-time signals to be queued to a process.
However, Linux does things differently. Up to and including Linux
2.6.7, Linux imposes a system-wide limit on the number of queued
real-time signals for all processes. This limit can be viewed and
(with privilege) changed via the /proc/sys/kernel/rtsig-max file. A
related file, /proc/sys/kernel/rtsig-nr, can be used to find out how
many real-time signals are currently queued. In Linux 2.6.8, these
/proc interfaces were replaced by the RLIMIT_SIGPENDING resource limit,
which specifies a per-user limit for queued signals; see setrlimit(2)
for further details.
L'ajout de signaux temps reel necessite l'agrandissement de la
structure de l'ensemble des signaux (sigset_t) de 32 a 64 bits. Par
consequent, divers appels systeme ont ete supplantes par de nouveaux
appels systeme qui gerent des ensembles de signaux plus grands. Les
anciens et nouveaux appels systeme sont les suivants :
Linux 2.0 et anterieurs Linux 2.2 et posterieurs
sigaction(2) rt_sigaction(2)
sigpending(2) rt_sigpending(2)
sigprocmask(2) rt_sigprocmask(2)
sigreturn(2) rt_sigreturn(2)
sigsuspend(2) rt_sigsuspend(2)
sigtimedwait(2) rt_sigtimedwait(2)
Interruption d'appel et de fonction par un gestionnaire de signal
Si un gestionnaire de signal est invoque pendant qu'un appel systeme ou
une fonction de bibliotheque est bloque, alors :
- soit l'appel est automatiquement redemarre apres le renvoi du
gestionnaire de signal ;
- soit l'appel echoue avec l'erreur EINTR.
Lequel de ces deux comportements se produira depend de l'interface et
de si le gestionnaire de signal a ete mis en place avec l'attribut
SA_RESTART (consultez sigaction(2)). Les details varient selon les
systemes UNIX ; voici ceux pour Linux.
Si un appel en attente a l'une des interfaces suivantes est interrompu
par un gestionnaire de signal, l'appel sera automatiquement redemarre
apres le renvoi du gestionnaire de signal si l'attribut SA_RESTART a
ete indique ; autrement, l'appel echouera avec l'erreur EINTR :
- Appels read(2), readv(2), write(2), writev(2) et ioctl(2) sur des
peripheriques << lents >>. Un peripherique << lent >> est un
peripherique ou un appel d'E/S peut bloquer pendant un temps
indefini, par exemple un terminal, un tube ou un socket. Si un appel
d'E/S sur un peripherique lent a deja transfere des donnees au
moment ou il est interrompu par un gestionnaire de signal, l'appel
renverra une indication de succes (normalement, le nombre d'octets
transferes). Remarquez que selon cette definition, un disque (local)
n'est pas un peripherique lent. Les operations d'E/S sur les
peripheriques disque ne sont pas interrompues par des signaux.
- open (2), s'il peut bloquer (par exemple, lors de l'ouverture d'une
FIFO ; consultez fifo(7)).
- wait(2), wait3(2), wait4(2), waitid(2), et waitpid(2).
- Interfaces de socket : accept(2), connect(2), recv(2), recvfrom(2),
recvmmsg(2), recvmsg(2), send(2), sendto(2) et sendmsg(2), a moins
qu'une temporisation n'ait ete placee sur le socket (voir
ci-dessous).
- Interfaces de blocage de fichier : flock(2) et les operations
F_SETLKW et F_OFD_SETLKW de fcntl(2)
- Interfaces de files de messages POSIX : mq_receive(3),
mq_timedreceive(3), mq_send(3) et mq_timedsend(3).
- Operation FUTEX_WAIT de futex(2) (depuis Linux 2.6.22 ; auparavant,
elle echouait toujours avec l'erreur EINTR).
- getrandom(2).
- pthread_mutex_lock(3), pthread_cond_wait(3) et autres API
apparentees.
- FUTEX_WAIT_BITSET de futex(2.
- Interfaces de semaphores POSIX : sem_wait(3) et sem_timedwait(3)
(depuis Linux 2.6.22 ; auparavant, elles echouaient toujours avec
l'erreur EINTR).
- read(2) d'un descripteur de fichier d'inotify(7) (depuis Linux 3.8 ;
auparavant, elle echouait toujours avec l'erreur EINTR).
Les interfaces suivantes ne sont jamais relancees apres avoir ete
interrompues par un gestionnaire de signal, quelle que soit
l'utilisation de SA_RESTART ; elles echouent toujours avec l'erreur
EINTR lorsqu'elles sont interrompues par un gestionnaire de signal :
- Interfaces de socket << entree >>, quand un delai de reception
(SO_RCVTIMEO) a ete defini sur le socket en utilisant
setsockopt(2) : accept(2), recv(2), recvfrom(2), recvmmsg(2) (aussi
avec un parametre timeout non NULL) et recvmsg(2).
- Interfaces de socket << sortie >>, quand un delai de reception
(SO_RCVTIMEO) a ete defini sur le socket en utilisant
setsockopt(2) : connect(2), send(2), sendto(2) et sendmsg(2).
- Interfaces utilisees pour attendre des signaux : pause(2),
sigsuspend(2), sigtimedwait(2) et sigwaitinfo(2).
- Interfaces de multiplexage de descripteurs de fichier :
epoll_wait(2), epoll_pwait(2), poll(2), ppoll(2), select(2) et
pselect(2).
- Interfaces IPC de System V : msgrcv(2), msgsnd(2), semop(2) et
semtimedop(2).
- Interfaces de sommeil : clock_nanosleep(2), nanosleep(2) et
usleep(3).
- io_getevents(2).
La fonction sleep(3) n'est egalement jamais relancee si elle est
interrompue par un gestionnaire, mais elle renvoie une indication de
succes : le nombre de secondes restantes pour le sommeil.
In certain circumstances, the seccomp(2) user-space notification
feature can lead to restarting of system calls that would otherwise
never be restarted by SA_RESTART; for details, see seccomp_unotify(2).
Interruption d'appel et de fonction par des signaux d'arret
Sous Linux, meme en l'absence de gestionnaire de signal, certaines
interfaces en mode bloquant peuvent echouer avec l'erreur EINTR apres
que le processus a ete arrete par l'un des signaux d'arret et relance
avec le signal SIGCONT. Ce comportement n'est pas ratifie par POSIX.1
et n'apparait pas sur d'autres systemes.
Les interfaces Linux qui affichent ce comportement sont :
- Interfaces de socket << entree >>, quand un delai de reception
(SO_RCVTIMEO) a ete defini sur le socket en utilisant
setsockopt(2) : accept(2), recv(2), recvfrom(2), recvmmsg(2) (aussi
avec un parametre timeout non NULL) et recvmsg(2).
- Les interfaces de socket << sortie >>, quand un delai de reception
(SO_RCVTIMEO) a ete defini sur le socket en utilisant
setsockopt(2) : connect(2), send(2), sendto(2) et sendmsg(2), si un
delai de transmission (SO_SNDTIMEO) a ete defini.
- epoll_wait(2), epoll_pwait(2).
- semop(2), semtimedop(2).
- sigtimedwait(2), sigwaitinfo(2).
- Linux 3.7 et anterieurs : read(2) sur un descripteur de fichier
inotify(7).
- Linux 2.6.21 et anterieurs : operation FUTEX_WAIT de futex(2),
sem_timedwait(3), sem_wait(3).
- Linux 2.6.8 et anterieurs : msgrcv(2), msgsnd(2).
- Linux 2.4 et anterieurs : nanosleep(2).
STANDARDS
POSIX.1, sauf indication contraire.
NOTES
Pour une discussion sur les fonctions sures de signal asynchrone,
consultez signal-safety(7).
The /proc/pid/task/tid/status file contains various fields that show
the signals that a thread is blocking (SigBlk), catching (SigCgt), or
ignoring (SigIgn). (The set of signals that are caught or ignored will
be the same across all threads in a process.) Other fields show the
set of pending signals that are directed to the thread (SigPnd) as well
as the set of pending signals that are directed to the process as a
whole (ShdPnd). The corresponding fields in /proc/pid/status show the
information for the main thread. See proc(5) for further details.
BOGUES
Six signaux existent qui peuvent etre delivres a cause d'une exception
materielle : SIGBUS, SIGEMT, SIGFPE, SIGILL, SIGSEGV et SIGTRAP. Lequel
de ces signaux est delivre pour n'importe quelle exception materielle
n'est pas documente et semble parfois ne pas etre logique.
Par exemple, un acces memoire non autorise qui provoque l'envoi de
SIGSEGV sur une architecture peut provoquer l'envoi de SIGBUS sur une
autre architecture ou vice versa.
Comme autre exemple, l'utilisation de l'instruction int de x86 avec un
argument interdit (tout nombre autre que 3 ou 128) provoque l'envoi de
SIGSEGV meme si SIGILL serait plus adapte a cause de la facon dont le
CPU rapporte l'operation interdite au noyau.
VOIR AUSSI
kill(1), clone(2), getrlimit(2), kill(2), pidfd_send_signal(2),
restart_syscall(2), rt_sigqueueinfo(2), setitimer(2), setrlimit(2),
sgetmask(2), sigaction(2), sigaltstack(2), signal(2), signalfd(2),
sigpending(2), sigprocmask(2), sigreturn(2), sigsuspend(2),
sigwaitinfo(2), abort(3), bsd_signal(3), killpg(3), longjmp(3),
pthread_sigqueue(3), raise(3), sigqueue(3), sigset(3), sigsetops(3),
sigvec(3), sigwait(3), strsignal(3), swapcontext(3), sysv_signal(3),
core(5), proc(5), nptl(7), pthreads(7), sigevent(3type)
TRADUCTION
La traduction francaise de cette page de manuel a ete creee par
Christophe Blaess , Stephan Rafin
, Thierry Vignaud ,
Francois Micaux, Alain Portal , Jean-Philippe
Guerard , Jean-Luc Coulon (f5ibh) , Julien Cristau , Thomas
Huriaux , Nicolas Francois
, Florentin Duneau
, Simon Paillard , Denis Barbier , David Prevot
, Cedric Boutillier ,
Frederic Hantrais et Jean-Paul Guillonneau
Cette traduction est une documentation libre ; veuillez vous reporter a
la GNU General Public License version 3
concernant les conditions
de copie et de distribution. Il n'y a aucune RESPONSABILITE LEGALE.
Si vous decouvrez un bogue dans la traduction de cette page de manuel,
veuillez envoyer un message a .
Pages du manuel de Linux 6.8 2 mai 2024 signal(7)