gestionnaire de signal différent pour le fil et le processus?. c’est possible

Avoir peu de questions concernant la signalisation.

1) quand le processus a peu plus de threads avec le thread principal, et si le signal est déclenché, quel thread va arrêter son traitement et continuer avec le gestionnaire de signal? Est-ce le fil principal ou autre que le fil principal?

2) Est-il possible de conserver différents gestionnaires pour le même signal entre le thread principal et le thread spécifique?

Les signaux peuvent être envoyés à un processus ou à un thread particulier. Pour les signaux envoyés au processus, le signal sera délivré dès qu’il y aura au moins un thread dont le signal n’est pas bloqué, et s’il ya plus d’un thread, il peut être transmis à l’un d’eux (imprévisible un). Pour les signaux envoyés à un thread particulier, ils sont livrés dès que le signal n’est pas bloqué.

L’utilisation de la fonction raise pour déclencher un signal envoie le signal au thread qui a appelé raise , pas à l’ensemble du processus. Les signaux générés automatiquement à la suite de ce que fait le thread (comme SIGSEGV SIGFPE et SIGPIPE ) sont également transmis à ce thread particulier.

Les signaux générés par le terminal ( SIGINT , SIGTSTP , SIGQUIT ) sont transmis à l’ensemble du processus.

Il n’y a aucun moyen d’installer des gestionnaires de signaux distincts pour chaque thread, mais le gestionnaire de signaux pour un signal peut être en mesure d’examiner le thread dans lequel il s’exécute. Si vous savez que le signal n’a pas interrompu une fonction asynchrone-signal pthread_self pour obtenir l’identifiant du thread en cours. Sinon, une méthode moche mais sûre consiste à prendre l’adresse de errno et à rechercher quel thread est basé sur cela (vous devrez garder une table de mappage vous-même et vous assurer que l’access à cette table est async-safe). ).