web-dev-qa-db-fra.com

Comment puis-je tuer un fil particulier d'un processus?

$ ps -e -T | grep myp | grep -v grep
  797   797 ?        00:00:00 myp
  797   798 ?        00:00:00 myp
  797   799 ?        00:00:00 myp
  797   800 ?        00:00:00 myp

Ceci indique le processus myp avec pid = 797 et quatre threads avec des plumes différentes.

Comment puis-je tuer un fil particulier du processus sans tuer tout le processus. Je comprends que cela pourrait ne pas être possible du tout dans certains cas lorsqu'il y a des dépendances fatales sur ce fil particulier. Mais est-il possible dans tous les cas? Est oui, comment?

J'ai essayé kill 799 et le processus lui-même a été résilié. Maintenant, je ne suis pas sûr que c'était parce qu'il y avait des dépendances qui ont fait myp échec sans le processus 800 ou parce que tuer est simple de ne pas tuer des processus individuels.

21
Lazer

Les threads font partie intégrante du processus et ne peuvent pas être tués à l'extérieur. Il y a la fonction pthread_kill , mais elle ne s'applique que dans le contexte du fil lui-même. Des docs sur le lien:

Notez que pthread_kill () ne fait que manipuler le signal dans le contexte du fil donné; L'action du signal (résiliation ou arrêt) affecte le processus dans son ensemble.

26
gvkv

La réponse canonique à cette question est la suivante: avec la coopération du processus, quel que soit le mécanisme fourni. Sans la coopération du processus, il est impossible. Que le processus consiste en des threads est un détail interne du processus qui est, par une conception intentionnelle, non exposée en dehors du processus.

6
David Schwartz

En plus de la réponse de @ GKV, vous pouvez consulter la fonction pthread_cancel(3), une partie de <pthread.h>. De la page man:

La fonction Pthread_Cancel () envoie une demande d'annulation au fil de fil. Que ce soit et lorsque le thread cible réagit à la demande d'annulation dépend de deux attributs sous le contrôle de ce fil: son état d'annulation et son type.

1
Ivan P

Vous pouvez trouver TGKILL () utile. Il est spécifique à Linux car la page d'homme mentionne.

tGKILL () Envoie le signal SIG au fil avec l'ID de thread Tid dans le groupe de fil TGID. (En revanche, Kill (2) ne peut être utilisé que pour envoyer un signal à un processus (c'est-à-dire un groupe de fil) dans son ensemble, et le signal sera livré à un fil arbitraire dans ce processus.)

1
Amit