これらは、Packet Receiverプロセスの個々のスレッドです。個々のスレッドを殺す方法はありますか?Linuxは、プロセス下の特定のスレッドを停止または停止信号を送信できる特定のコマンドを提供しますか?
これらは、Packet Receiverプロセスの個々のスレッドです。個々のスレッドを殺す方法はありますか?Linuxは、プロセス下の特定のスレッドを停止または停止信号を送信できる特定のコマンドを提供しますか?
回答:
一般に、より大きなプロセスから個々のスレッドを強制終了することは非常に危険です。そのスレッドは:
一般に、アプリケーション自体による管理と同期以外では、個々のスレッドを強制終了することは意味がありません。
あなたは使用することがありますtgkill(2)またはtkill
Cプログラムでは、(あなたが使用する必要がありますのsyscall(2) )が、あなたはしたくありません。プログラム内からpthread_kill(3)を使用できます-これはめったに役立ちません。
(スレッドにどのような効果があるのtgkill
かtkill
、SIGKILL
またはSIGTERM
- と一緒に-など)
pthreads(7)ライブラリの使用、低レベルのもの(一部を含む信号(7) -sとのfutex(7) -s等...;も参照(7)NPTL)、あなたは生殺した場合は(とtkill
やtgkill
)いくつかの個々のスレッドでは、一部の内部不変式が破損するため、プロセスは何らかの誤った状態になります(したがって未定義の動作)。
したがって、パケット受信プログラムのドキュメントを調べて、他の方法を見つけてください。フリーソフトウェアの場合は、ソースコードを調べて改善してください。
signal(7)およびsignal-safety(7)を注意深く読んでください。シグナルは(kill(2)によって)プロセスに送信され、スレッドで処理されることを意図しています。
そして実際には、シグナルとスレッドはうまく結婚しません。pthreadのチュートリアルを読んでください。
マルチスレッドプログラムをコーディングするとき(およびのような外部信号を処理する場合SIGTERM
)の一般的なトリックは、pipe(7)を独自のプロセスに使用し、poll(2)を他のスレッドにパイプすることです(Linuxを検討することもできます)特定のsignalfd(2))、シグナルハンドラwrite(2)で-バイトまたはそれらのいくつかをそのパイプに入れます。このよく知られているトリックは、Qtのドキュメントで詳しく説明されています(Qtがなくても、独自のプログラムで使用できます)。
tgkill
関数は、スレッドを終了する方法を提供しません。スレッドにシグナルを送信します。プロセスを強制終了する歴史的な方法であり、スレッドの強制終了には使用できないため、「kill」という名前が付けられています。
SIGKILL
スレッドにを送信することは、それを害していると思います。それとも、常にプロセス全体を殺していますか?そして、どうSIGTERM
ですか?ところで、たとえスレッドだけが害を受けたとしても、私のポイントはプロセスが悲惨な状態にあるということです。
SIGKILL
and SIGTERM
シグナルが定義されています。それは、どのスレッドがそれらを受け取るかに関係なく当てはまります-それらはまだ同じことを意味します。プロセスの緊密な協力なしにスレッドを終了することは、くだらないシュートであり、プロセスに壊滅的な影響を与える可能性があります。