web-dev-qa-db-ja.com

プロセスの特定のスレッドを強制終了するにはどうすればよいですか?

$ 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

これは、PID = 797のプロセスmypと、異なるSPIDの4つのスレッドを示しています。

プロセス全体を強制終了せずに、プロセスの特定のスレッドを強制終了するにはどうすればよいですか。特定のスレッドに致命的な依存関係がある場合、場合によってはまったく不可能である可能性があることを理解しています。しかし、それはどんな場合でも可能ですか?はい、どうですか?

私は試した kill 799とプロセス自体が終了しました。 mypをプロセスなしで失敗させる依存関係があったため、これが原因であるかどうかはわかりません800またはkillは単純なので、個々のプロセスをkillすることはできません。

21
Lazer

スレッドはプロセスの不可欠な部分であり、プロセスの外部で強制終了することはできません。 pthread_kill 関数がありますが、これはスレッド自体のコンテキストでのみ適用されます。リンクのドキュメントから:

Pthread_kill()は、シグナルが指定されたスレッドのコンテキストでのみ処理されることに注意してください。 シグナルアクション(終了または停止)は、プロセス全体に影響します。

26
gvkv

この質問に対する標準的な答えは次のとおりです。プロセスの協力を得て、プロセスが提供するメカニズムによって。プロセスの協力がなければ、それは不可能です。プロセスがスレッドで構成されることは、プロセスの内部の詳細であり、意図的な設計により、プロセスの外部に公開されていません。

6
David Schwartz

@gkvの回答に加えて、_<pthread.h>_の一部である関数pthread_cancel(3)を確認できます。 manページから:

Pthread_cancel()関数は、キャンセル要求をスレッドスレッドに送信します。ターゲットスレッドがキャンセル要求に反応するかどうか、およびいつ反応するかは、そのスレッドの制御下にある2つの属性、つまりキャンセル可能状態とタイプに依存します。

1
Ivan P

tgkill() が役立つかもしれません。マニュアルページで言及されているように、これはLinux固有です。

tgkill()は、スレッドグループtgidのスレッドID tidを持つスレッドにシグナルsigを送信します。 (対照的に、kill(2)は、全体としてプロセス(つまり、スレッドグループ)にシグナルを送信するためにのみ使用でき、シグナルはそのプロセス内の任意のスレッドに配信されます。)

1
Amit