Traitement du Signal avec plusieurs threads sous Linux
Sous Linux, ce qui se produit lorsqu'un programme (qui a peut-être plusieurs threads) reçoit un signal, comme un SIGTERM ou SIGHUP?
Thread qui intercepte le signal? Plusieurs threads peuvent obtenir le même signal? Est-il un fil spécial entièrement dédié à la manipulation des signaux? Si pas, ce qui se passe à l'intérieur de la thread qui est de gérer le signal? Comment fonctionne l'exécution reprend après le gestionnaire de signal de routine finitions?
Vous devez vous connecter pour publier un commentaire.
Ce qui est légèrement nuancée, en fonction de la version du noyau Linux que vous utilisez.
En supposant 2.6 threads posix, et si l'on parle de l'OS de l'envoi de signal SIGTERM ou SIGHUP, le signal est envoyé, ce qui est reçue par et traitées par la racine fil. À l'aide de threads POSIX, vous pouvez également envoyé SIGTERM de threads individuels en tant que bien, mais je soupçonne que vous posez sur ce qui se passe lorsque le système d'exploitation envoie le signal au processus.
En 2.6, SIGTERM sera la cause de threads enfants à la sortie "propre", où, comme 2.4, threads enfants ont été laissés dans un état indéterminé.
pthreads(7)
décrit que POSIX.1 exige que tous les threads d'un processus de partage d'attributs, y compris:POSIX.1 exige également certains attributs pour être distinctes pour chaque thread, y compris:
masque de signal (
pthread_sigmask(3)
)suppléant signal de pile (
sigaltstack(2)
)Le noyau Linux est
complete_signal
routine a le bloc de code suivant -- les commentaires sont très utiles:Donc, vous voyez que vous êtes en charge de la où les signaux sont livrés:
Si votre processus a mis un signal de la disposition à
SIG_IGN
ouSIG_DFL
, puis le signal est ignoré (ou par défaut -- tuer, de base, ou de l'ignorer) pour tous les threads.Si votre processus a mis un signal de la disposition d'un gestionnaire spécifique de routine, alors vous pouvez contrôler le thread qui va recevoir les signaux en manipulant thread spécifique masques de signal à l'aide de
pthread_sigmask(3)
. Vous pouvez nommer un thread pour gérer tous les, ou de créer un thread par signal, ou tout mélange de ces options pour des signaux spécifiques, ou vous comptez sur le noyau Linux actuelles du comportement par défaut de la distribution du signal pour le thread principal.Certains signaux, cependant, sont spéciaux selon les
signal(7)
homme page: