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
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.
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.
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.
- 1. Implémentation de signaux sous Linux et Windows?
- 2. comment intercepter les signaux Linux? (en C)
- 3. Signaux UNIX/Linux
- 4. Existe-t-il des signaux suspendus de reprise sous Linux?
- 5. Signaux sous Windows
- 6. Comment traiter les signaux dans une sous-classe Qt?
- 7. Python - piège tous les signaux
- 8. Comment les projets openSource sont-ils gérés?
- 9. Comment fonctionnent les signaux Django?
- 10. E/S asynchrones sous Mac OS X
- 11. Comment compiler sous linux
- 12. Communication semi-duplex série sous Linux
- 13. Attraper un signal sous Linux
- 14. Comment synchroniser les méthodes asynchrones?
- 15. OpenSSL et les signaux
- 16. signaux de débogage Qt, machines à sous et les connexions
- 17. Comment gérer un sémaphore POSIX partagé avec des signaux asynchrones dans une application multithread
- 18. Comment @autowire dans les beans gérés jsf
- 19. comment utiliser gprof sous Linux?
- 20. CoreData: Les objets gérés dans d'autres objets gérés sont null
- 21. Conversion entre les types gérés et non gérés en C++?
- 22. Comment configurer delayed_jobs sous Linux?
- 23. J'écoute explicitement les signaux
- 24. Comment arrêter les logs (rsyslog) pour les commandes sous Linux?
- 25. Comment construire libfetch sous linux?
- 26. Comment installer JavaPOS sous Linux?
- 27. Visualiser les signaux QT et les slots
- 28. Comment les signaux transmettent-ils dans Qt?
- 29. Comment suivre les signaux émis dans QT?
- 30. Comment bloquer les signaux en C?