2011-06-06 3 views
7

J'écris un programme multithread où je veux gérer une commande Ctrl-C de l'utilisateur pour terminer l'exécution. Autant que je sache, il n'y a aucune garantie que le fil principal, qui est capable d'annuler chaque fil de travail, attrape le signal. Est-il nécessaire, par conséquent, d'avoir un gestionnaire de signal différent du code du thread de travail afin que quiconque attrape le signal s'il arrive, ou y a-t-il une autre façon de le faire avec un gestionnaire de signal?attraper SIGINT dans un programme multithread

Répondre

8

Vous pouvez bloquer les signaux du thread appelant avec pthread_sigmask(). Et, comme les signaux bloqués sont hérités des threads nouvellement créés, vous pouvez bloquer SIGINT dans le thread principal, puis lancer vos autres threads, puis le débloquer dans le thread principal, si cela est préférable.

+0

mais de cette façon ne va pas un signal sigint à être perdu si un fils-fils arrive à l'attraper et l'ignore tout simplement? – nikos

+1

@nikos: Oui, mais je ne vois pas la relation avec ce que j'écrivais; Si un thread bloque un signal, il ne peut pas, par définition, l'attraper. – janneb

+1

@nikos: Un signal n'est jamais envoyé à un thread qui l'a bloqué (par exemple en utilisant 'pthread_sigmask()') - ceci est différent du thread qui l'attrape et l'ignore. Si tous les threads du thread principal ont 'SIGINT' bloqué, alors il sera toujours remis au thread principal. – caf

Questions connexes