Je voudrais savoir exactement comment l'exécution asynchrone les gestionnaires de signaux fonctionne sur Linux. Tout d'abord, je ne sais pas à qui thread exécute le gestionnaire de signal. Deuxièmement, je voudrais savoir les étapes à suivre pour rendre le fil d'exécuter le gestionnaire de signal.
Sur la première question, j'ai lu deux, apparemment contradictoires, explications:
-
Le Noyau Linux, par Andries Brouwer, §5.2 "la Réception de signaux" les états:
Lorsqu'un signal arrive, le processus est interrompu, les registres actuels sont enregistrés, et le gestionnaire de signal est invoquée. Lorsque le gestionnaire de signal retourne, l'interruption de l'activité est poursuivie.
-
Le StackOverflow question "Traiter Avec Asynchrone Signaux Multi Threaded Programme" m'amène à penser que le comportement de Linux est comme SCO Unix est:
Lorsqu'un signal est transmis à un processus, s'il est pris, il sera traité par un, et un seul, d'entre les fils de la réunion de l'une des conditions suivantes:
Un thread bloqué dans un sigwait(2) de l'appel système dont l'argument ne comprennent le type de choper le signal.
Un thread dont le signal de masque de ne pas inclure le type de choper le signal.
Autres considérations:
- Un thread bloqué dans sigwait(2) , la préférence est donnée sur un thread ne bloque pas le type de signal.
- Si plus d'un thread répond à ces exigences (peut-être deux threads d'appel sigwait(2)), puis l'un d'eux sera choisi. Ce choix n'est pas prévisible par les programmes d'application.
- Si aucun thread n'est admissible, le signal reste `en attente" au niveau du processus jusqu'à ce fil devient admissible.
Aussi, "L'Linux Signaux Modèle de gestion" par Moshe Bar états "Asynchrone signaux sont livrés pour le premier thread trouvé pour ne pas bloquer le signal.", qui-je l'interpréter à dire que le signal est remis à un thread ayant son sigmask pas compris le signal.
Laquelle est la bonne?
Sur la deuxième question, ce qui se passe à la pile et le contenu d'un registre pour le fil? Supposons que le fil-à-exécutez-le-signal-gestionnaire de T est dans le milieu de l'exécution d'un do_stuff()
fonction. Est thread T's de la pile utilisée directement pour exécuter le gestionnaire de signal (c'est à dire l'adresse du signal trampoline est poussé sur T's de la pile et le contrôle de flux va pour le gestionnaire de signal)? Sinon, est séparé de la pile utilisée? Comment ça fonctionne?