2010-06-27 4 views
9

Des idées là-dessus? Y a-t-il une sorte de file d'attente de signal, ou est-ce qu'elle est abandonnée?Que se passe-t-il si pendant un traitement de signal sous UNIX, le même signal est envoyé au programme?

Pendant que nous sommes à cette question, est-il vrai que les gestionnaires de signaux devraient faire le moins de travail possible?

J'ai lu quelque part qu'un gestionnaire de signal doit utiliser un canal et juste écrire un octet, indiquant ce que le programme devrait faire. Ensuite, ailleurs, le programme vérifie périodiquement le canal et envoie les informations en fonction de l'octet qu'il contient. (J'ai peut-être mal compris)

Merci, Boda Cydo.

Répondre

8

Pour répondre à la deuxième partie de votre question, "est-il vrai que les gestionnaires de signaux doivent faire le moins de travail possible?" la réponse est oui, car il y a un ensemble très minime de fonctions qui sont "async signal safe" et qui peuvent donc être appelées depuis les gestionnaires de signaux. La sécurité des signaux asynchrones est en quelque sorte une forme améliorée de réentrée. Si foo() est un signal asynchrone sécurisé, cela signifie qu'il est possible d'appeler foo() en toute sécurité dans un gestionnaire de signal, même si foo() était déjà en cours d'exécution lorsque le signal a été déclenché.

Vous pouvez obtenir la liste complète des fonctions de sécurité du signal asynchrone en regardant la page de manuel de la section 7 pour signal (man 7 signal). L'appel de toute fonction autre que l'une d'entre elles dans un gestionnaire de signal, directement ou indirectement, appelle un comportement indéfini. L'approche «écrire un octet sur un tuyau» est un excellent moyen de traiter les signaux sans être limité aux fonctions de sécurité du signal asynchrone, surtout si votre programme est déjà orienté autour d'une boucle select.

7

Pour répondre à la première partie de votre question, la valeur par défaut est la suivante: S'il s'agit du même signal que celui en cours de traitement, le nouveau signal est bloqué (conservé dans une file d'attente). Si un autre signal arrive, le gestionnaire du nouveau signal est appelé. c.f. the glibc manual.

+0

Ou l'action par défaut pour le signal est prise si le signal n'est pas géré –

Questions connexes