$ 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することはできません。
スレッドはプロセスの不可欠な部分であり、プロセスの外部で強制終了することはできません。 pthread_kill 関数がありますが、これはスレッド自体のコンテキストでのみ適用されます。リンクのドキュメントから:
Pthread_kill()は、シグナルが指定されたスレッドのコンテキストでのみ処理されることに注意してください。 シグナルアクション(終了または停止)は、プロセス全体に影響します。
この質問に対する標準的な答えは次のとおりです。プロセスの協力を得て、プロセスが提供するメカニズムによって。プロセスの協力がなければ、それは不可能です。プロセスがスレッドで構成されることは、プロセスの内部の詳細であり、意図的な設計により、プロセスの外部に公開されていません。
@gkvの回答に加えて、_<pthread.h>
_の一部である関数pthread_cancel(3)
を確認できます。 manページから:
Pthread_cancel()関数は、キャンセル要求をスレッドスレッドに送信します。ターゲットスレッドがキャンセル要求に反応するかどうか、およびいつ反応するかは、そのスレッドの制御下にある2つの属性、つまりキャンセル可能状態とタイプに依存します。
tgkill() が役立つかもしれません。マニュアルページで言及されているように、これはLinux固有です。
tgkill()は、スレッドグループtgidのスレッドID tidを持つスレッドにシグナルsigを送信します。 (対照的に、kill(2)は、全体としてプロセス(つまり、スレッドグループ)にシグナルを送信するためにのみ使用でき、シグナルはそのプロセス内の任意のスレッドに配信されます。)