Sous Linux, que se passe-t-il quand un programme (qui a éventuellement plusieurs threads) reçoit un signal, comme SIGTERM ou SIGHUP?
Quel thread intercepte le signal? Plusieurs threads peuvent-ils recevoir le même signal? Existe-t-il un thread spécial entièrement dédié à la gestion des signaux? Sinon, que se passe-t-il à l'intérieur du thread qui doit gérer le signal? Comment l'exécution reprend-elle une fois la routine du gestionnaire de signaux terminée?
pthreads(7)
décrit que POSIX.1 requiert tous les threads dans un attribut de partage de processus, notamment:POSIX.1 nécessite également que certains attributs soient distincts pour chaque thread, notamment:
masque de signal (
pthread_sigmask(3)
)pile de signaux alternative (
sigaltstack(2)
)La
complete_signal
routine du noyau Linux a le bloc de code suivant - les commentaires sont très utiles:Ainsi, vous voyez que vous êtes en charge de l'endroit où les signaux sont délivrés:
Si votre processus a défini la disposition d'un signal sur
SIG_IGN
ouSIG_DFL
, alors le signal est ignoré (ou par défaut - kill, core ou ignore) pour tous les threads.Si votre processus a défini la disposition d'un signal sur une routine de gestionnaire spécifique, vous pouvez contrôler quel thread recevra les signaux en manipulant des masques de signal de thread spécifiques à l'aide de
pthread_sigmask(3)
. Vous pouvez désigner un thread pour tous les gérer, ou créer un thread par signal, ou tout mélange de ces options pour des signaux spécifiques, ou vous vous fiez au comportement par défaut actuel du noyau Linux pour fournir le signal au thread principal.Certains signaux, cependant, sont spéciaux selon la
signal(7)
page de manuel:la source