Ce sont les threads individuels du processus Packet Receiver. Existe-t-il un moyen de tuer un thread individuel? Linux fournit-il une commande spécifique qui peut tuer ou envoyer un signal d'arrêt à un thread particulier dans le cadre d'un processus?
13
Réponses:
Il est généralement assez dangereux de tuer un thread individuel à partir d'un processus plus vaste. Ce fil pourrait:
En général, en dehors de la gestion et de la synchronisation par l'application elle-même, la suppression de threads individuels n'est pas quelque chose de sensé.
la source
Vous pouvez utiliser tgkill (2) ou
tkill
dans votre programme C (vous devrez utiliser syscall (2) ) mais vous ne le souhaitez pas . Depuis l'intérieur de votre programme, vous pouvez utiliser pthread_kill (3) - ce qui est rarement utile.(Je ne sais pas exactement quel effet cela aurait
tgkill
outkill
- par exemple avecSIGKILL
ouSIGTERM
- sur un fil)La bibliothèque pthreads (7) utilise des éléments de bas niveau (y compris certains signaux (7) -s et futex (7) -s etc ...; voir aussi nptl (7) ) et si vous avez tué brutalement (avec
tkill
outgkill
) certains thread individuel, votre processus serait dans un mauvais état (donc comportement indéfini ) car certains invariants internes seraient cassés.Alors étudiez la documentation de votre programme de récepteur de paquets et trouvez une autre manière. S'il s'agit d' un logiciel libre , étudiez son code source et améliorez-le.
Lisez attentivement le signal (7) et la sécurité du signal (7) . Les signaux sont destinés à être envoyés aux processus (par kill (2) ) et traités dans les threads.
Et dans la pratique, les signaux et les fils ne se marient pas bien. Lisez un didacticiel pthread .
Une astuce courante, lorsque vous codez un programme multi-thread (et que vous souhaitez gérer des signaux externes comme
SIGTERM
) est d'utiliser un pipe (7) pour votre propre processus et d' interroger (2) ce pipe dans un autre thread (vous pouvez également considérer Linux signalfd spécifique (2) ), avec un signal hander write (2) -ing un octet ou quelques-uns d'entre eux dans ce tuyau. Cette astuce bien connue est bien expliquée dans la documentation de Qt (et vous pouvez l'utiliser dans votre propre programme, même sans Qt).la source
tgkill
fonction ne fournit aucun moyen de terminer un thread. Il envoie un signal à un thread. Il est nommé "kill" car c'est la manière historique de tuer un processus et il ne peut pas être utilisé pour tuer un thread.SIGKILL
à un fil de discussion lui nuit. Ou est-ce que cela tue toujours tout le processus? Et qu'en est-ilSIGTERM
? BTW, même si seul un thread est endommagé, mon point est que le processus est dans un état désastreux.SIGKILL
etSIGTERM
sont définis pour tuer ou terminer le processus. Cela est vrai quel que soit le fil qui les reçoit - ils signifient toujours la même chose. Terminer un fil sans la coopération étroite de son processus serait une connerie et probablement catastrophique pour le processus.