web-dev-qa-db-ja.com

Linuxのプロセスで個々のスレッドを殺す方法は?

enter image description here

これらは、Packet Receiverプロセスの個々のスレッドです。個々のスレッドを強制終了する方法はありますか? Linuxは、プロセス内の特定のスレッドを停止または停止信号を送信できる特定のコマンドを提供していますか?

13

大きなプロセスから個々のスレッドを強制終了することは、一般的に非常に危険です。そのスレッドは:

  • 破損する可能性のある他のスレッドとの共有状態を変更している
  • 解放されないロックを保持しているため、ロックが無期限に利用できなくなる
  • ...または他のスレッドが失敗する原因となる可能性のある他の多くのこと。

一般に、アプリケーション自体による管理と同期の外では、個々のスレッドを強制終了することは意味のあることではありません。

16
Chris Down

Cプログラムで tgkill(2) またはtkillを使用する場合があります( syscall(2) を使用する必要があります)したくない。プログラム内から pthread_kill(3) を使用できます。これはほとんど役に立ちません。

(私はtgkillまたはtkill-SIGKILLまたはSIGTERMを使用すると、どのような影響があるかを正確に知りません-スレッド上で)

pthreads(7) ライブラリは低レベルのものを使用します(一部の signal(7) -sおよび futex(7) -sなどを含みます)。 ..; nptl(7) )も参照してください。また、(tkillまたはtgkillを使用して)個別のスレッドをraw killした場合、プロセスが間違っている可能性があります状態(したがって 未定義の動作 )は、一部の内部不変式が壊れているためです。

したがって、パケット受信プログラムのドキュメントを調べて、他の方法を見つけてください。 free software の場合、そのソースコードを調べて改善します。

signal(7) および signal-safety(7) をもっと注意深く読んでください。シグナルはプロセスに送信され( kill(2) によって)、スレッドで処理されることを意図しています。

そして実際には、シグナルとスレッドはうまく結合しません。 pthread tutorial を読んでください。

マルチスレッドプログラムをコーディングするとき(そしてSIGTERMのようなexternalシグナルを処理したいとき)の一般的なトリックは、 pipe(7)を使用することです 独自のプロセスに poll(2) 他のスレッドのパイプ(Linux固有の signalfd(2) )とシグナルハンドラーを考慮 write(2) -バイトまたはそれらのいくつかをパイプに挿入します。そのよく知られたトリックは Qtドキュメント でよく説明されています(そして、Qtがなくても自分のプログラムでそれを使用できます)。

12