2011-05-06 2 views
7

Cela semble être une question stupide, mais je ne trouve pas la réponse à n'importe où je regarde. Je sais que sous UNIX, les signaux sont gérés de manière asynchrone. Si j'écris une fonction qui gère un signal, où cette fonction s'exécute-t-elle? Un nouveau thread est-il apparu? Un thread existant est-il interrompu d'une manière ou d'une autre? Ou est-ce géré dans un thread système comme les E/S asynchrones?Comment les signaux asynchrones sont-ils gérés sous Linux?

Répondre

2

Un thread de processus existant est interrompu jusqu'à la fin de la fonction. Il existe de sérieuses restrictions sur ce qu'il peut faire en toute sécurité pour s'assurer qu'il ne corrompt pas les appels d'état de la fonction au milieu - en particulier, toutes les fonctions qu'il appelle que le thread peut avoir déjà appelées doivent être ré-entrantes asynchrones. Voir les pages de manuel par ex. signal, sigaction pour plus de détails ou poser des questions plus spécifiques que vous le souhaitez.

6

Une fonction de signal est exécutée comme si un thread dans le processus avait été interrompu. C'est-à-dire que le gestionnaire de signal est appelé en utilisant le thread signalé et que la pile est réorganisée de sorte que lorsque le gestionnaire de signal revient, le thread poursuit l'exécution. Aucun nouveau thread n'est introduit.

2

Ce n'est pas un thread séparé, mais votre code est suspendu à la hâte. C'est pourquoi seul un sous-ensemble limité des appels POSIX est disponible.

De l'signal man page:

Le gestionnaire de routine doit être très prudent, car le traitement ailleurs été interrompue à un moment arbitraire. POSIX a le concept de "fonction sûre". Si un signal interrompt une fonction dangereuse et que le gestionnaire appelle une fonction dangereuse, le comportement n'est pas défini. Les fonctions sûres sont listées explicitement dans les différentes normes.