Un gestionnaire de signal peut-il être interrompu par un autre signal (sauf SIGKILL, SIGSTOP)?
Par conséquent, dois-je vérifier la EINTR
d’ EINTR
dans mon gestionnaire de signal lorsque j’appelle des appels système interruptibles?
(Linux et autres Unix)
Oui, l’exécution d’un gestionnaire de signaux peut elle-même être interrompue par l’envoi d’un autre signal.
Il y a cependant quelques nuances.
Par défaut, les gestionnaires de signaux définis par l’utilisateur bloquent temporairement le signal même qui les a invoqués. C’est le comportement par défaut de sigaction
moins que l’indicateur SA_NODEFER ne soit défini. (C’est également le comportement de la fonction de signal
plus ancienne et déconseillée, du moins sur la plupart des implémentations.)
En outre, sigaction
peut explicitement bloquer les signaux pendant l’exécution du gestionnaire en définissant le membre sa_mask
de la const struct sigaction
. La plupart du code que vous voyez va explicitement vider ce membre lors de l’initialisation de la structure, bien qu’il soit souvent plus robuste de sigfillset
ce membre sans se soucier des interruptions.
Donc, encore une fois, oui. Manipulez EINTR, errno
, & c. selon le cas, ou, mieux encore, concevez le gestionnaire pour ne pas faire plus que définir un drapeau sig_atomic_t
et éviter de nombreux soucis.