2017-07-29 12 views
1

Le signal peut être reçu dans tous les threads ou dans le programme principal lui-même. J'ai créé un thread auxiliaire à partir du programme principal. donc il y a deux threads dans mon programme 1. thread principal (processus lui-même) 2. Fil auxiliaire. Je veux juste que chaque fois que le signal est arrivé dans mon thread auxiliaire, cela devrait envoyer un signal à mon thread principal (programme). J'utilise pthread_kill (main_threadid, sig) pour envoyer le signal du registre du gestionnaire de signaux à l'intérieur du thread auxiliaire. mais. j'observe chaque signal de temps envoyé au fil principal reçu à l'enfant auxiliaire lui-même et le gestionnaire de signal tombe dans la boucle de recevoir le signal d'envoi. Disons que j'envoie SIGINT pour traiter à partir du terminal en utilisant son identifiant de processus.pthread_kill() n'envoie pas de signal au thread principal (programme principal)

+1

Je ne sais pas exactement ce que vous essayez de faire, mais l'utilisation de signaux globaux pour la communication entre threads n'est probablement pas la bonne approche. – thrig

Répondre

2

de la programmation avancée dans l'environnement Unix:

Chaque thread a son propre masque de signal, mais la disposition du signal est partagé par tous les threads du processus. Ce signifie que les threads individuels peuvent bloquer les signaux, mais lorsqu'un thread modifie l'action associée à un signal donné, tous les threads partagent l'action. Ainsi, si un thread choisit d'ignorer un signal donné, un autre thread peut annuler ce choix en restaurant la disposition par défaut ou en installant un gestionnaire de signal pour le signal.

L'appel sigaction définit la disposition du signal pour tout le processus (et tous les threads de ce processus). Lorsque vous envoyez un signal au processus, n'importe quel thread (mais seulement 1 thread) qui n'a pas bloqué le signal peut le recevoir (bien que de mon expérience limitée, le thread principal soit généralement préféré). Dans votre code, le thread principal est susceptible d'obtenir le signal, en exécutant le gestionnaire de signal et en renvoyant rapidement le signal à lui-même à nouveau.

Si vous souhaitez que votre fil auxiliaire unique pour traiter tous les signaux pour votre processus, vous pouvez utiliser pthread_sigmask dans votre thread principal pour bloquer les signaux en question:

sigset_t set; 
sigemptyset(&set); 
sigaddset(&set, SIGTERM); 
sigaddset(&set, SIGHUP); 
sigaddset(&set, SIGINT); 
sigaddset(&set, SIGCONT); 
sigaddset(&set, SIGTSTP); 
pthread_sigmask(SIG_BLOCK, &set, NULL); 

Cela permettra d'assurer un signal? livré à ce fil. Si vous faites cela avant pthread_create, vous devrez les débloquer dans votre thread auxiliaire.

Vous pouvez ensuite utiliser un mécanisme de communication sans fil entre signaux pour communiquer avec le thread principal.

+0

Merci pour la clarification sur la disposition du signal et le masque de signal, principalement "appel de sigaction est la mise en disposition du signal pour l'ensemble du processus". Je ne veux pas recevoir de signal dans un thread auxiliaire, je veux que tous les signaux ne soient reçus que dans le thread principal, donc je bloque simplement tous les signaux en utilisant pthread_sigmask dans le thread fils. Maintenant, je peux voir (en utilisant le gestionnaire de signal) tous les signaux de réception aux threads principaux seulement (Thats Great !!). mais aussi vite que j'envoie le même signal du terminal en utilisant while loop, tout le signal est reçu dans le thread principal (c'est correct) mais je n'ai pas reçu tout le signal envoyé du terminal –

+0

Salut Steven, vous avez raison " signal, en exécutant le gestionnaire de signal, puis rapidement renvoyer le signal à lui-même. " Dans mon système, pour 100 essais pour le signal, le signal 25 (ce nombre varie sur un ensemble différent de 100 essais) vient à thread fils et le reste vient au fil principal. –