Interruption du gestionnaire de signal avec un autre signal?

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.