Dies sind die einzelnen Threads des Packet Receiver-Prozesses. Gibt es eine Möglichkeit, einen einzelnen Thread abzutöten? Stellt Linux einen bestimmten Befehl zur Verfügung, mit dem ein Stoppsignal an einen bestimmten Thread in einem Prozess abgebrochen oder gesendet werden kann?
13
Antworten:
Es ist im Allgemeinen ziemlich gefährlich, einen einzelnen Thread in einem größeren Prozess abzutöten. Dieser Thread könnte:
Im Allgemeinen ist es nicht sinnvoll, einzelne Threads zu löschen, außer dass sie von der Anwendung selbst verwaltet und synchronisiert werden.
quelle
Sie können tgkill (2) oder
tkill
in Ihrem C-Programm verwenden (Sie müssen syscall (2) verwenden ), möchten dies aber nicht . In Ihrem Programm können Sie pthread_kill (3) verwenden - was selten nützlich ist.(Ich weiß nicht genau, welchen Effekt das haben würde
tgkill
odertkill
- zB mitSIGKILL
oderSIGTERM
- auf einen Thread)Die pthreads (7) -Bibliothek verwendet Low-Level-Inhalte (einschließlich einiger signal (7) -s und futex (7) -s etc ...; siehe auch nptl (7) ) und ob Sie einige roh (mit
tkill
odertgkill
) getötet haben Einzelthread, Ihr Prozess wäre in einem falschen Zustand (so undefiniertes Verhalten ), weil eine interne Invariante unterbrochen wäre.Lesen Sie also die Dokumentation Ihres Paketempfängerprogramms und suchen Sie einen anderen Weg. Wenn es sich um freie Software handelt , lesen Sie den Quellcode und verbessern Sie ihn.
Lesen Sie Signal (7) und Signalsicherheit (7) genauer durch . Signale sollen an Prozesse gesendet (mit kill (2) ) und in Threads verarbeitet werden.
Und in der Praxis heiraten Signale und Threads nicht gut. Lesen Sie ein pthread-Tutorial .
Ein häufiger Trick beim Codieren eines Multithread-Programms (und wenn Sie mit externen Signalen umgehen möchten
SIGTERM
) ist, eine Pipe (7) zu Ihrem eigenen Prozess zu verwenden und diese Pipe in einem anderen Thread abzufragen (2) (Sie könnten auch Linux in Betracht ziehen) spezifisches Signal fd (2) ), wobei ein Signalhandler (2) ein Byte oder einige davon in diese Pipe schreibt . Dieser bekannte Trick ist in der Qt-Dokumentation gut erklärt (und Sie können ihn auch ohne Qt in Ihrem eigenen Programm verwenden).quelle
tgkill
Funktion bietet keine Möglichkeit, einen Thread zu beenden. Es sendet ein Signal an einen Thread. Der Name lautet "kill", da dies die historische Methode zum Beenden eines Prozesses ist und nicht zum Beenden eines Threads verwendet werden kann.SIGKILL
an einen Thread ihm schadet. Oder tötet es immer den gesamten Prozess? Und was ist mitSIGTERM
? Übrigens, auch wenn nur ein Thread beschädigt ist, ist mein Punkt, dass der Prozess in einem schlechten Zustand ist.SIGKILL
undSIGTERM
werden definiert, um den Prozess abzubrechen oder zu beenden. Das gilt unabhängig davon, welchen Thread sie erhalten - sie bedeuten immer noch dasselbe. Das Beenden eines Threads ohne die enge Zusammenarbeit seines Prozesses wäre ein Misttrieb und für den Prozess wahrscheinlich katastrophal.