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


21
$ 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

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

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

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

回答:


26

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

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


+1。ここに追加するだけです。プロセス内で、pthread_kill()を使用して、個々のスレッドにシグナルを送信できます。それを行うシグナルハンドラを追加することができます。
ヘマント

@hemant:MS Wordがスペルチェックに別のスレッドを使用するとします。そのように設計されていない限り、そのスレッドを殺しても全体がダウンすることはありません。このような状況では、スレッドがなければプロセスが存在できないのはなぜですか?
レーザー

1
スレッドモデルを親プロセスから独立して設計できると思いますが、外部プロセスがプロセス内スレッドを殺すことはできますが、セキュリティ、プロセス管理、システムの整合性に関してワームの缶を開きますどんなシステム設計者も喜んで自分自身を提出すると思います。スレッド化は、このような頭痛の種がなければ十分に困難です。内部からスレッドを削除しても問題はありません。問題は親プロセスによって実行されるためです。親プロセスは、問題が発生し、自動またはその他の方法で削除できる場合に責任を負います。
gvkv

「そのように設計されていない限り」:スレッドを使用する主な理由は、リソースを共有できるようにするためです。それは家の半分を倒すようなものです。
pjc50

2
@Lazer、入力中のスレッドが別のスレッドがテキストを更新するのと同時に、あるスレッドがスペルをチェックできません。このため、バックグラウンドのスペルチェックスレッドを使用するには、ロックを取得して他のスレッドによるテキストの変更を防ぎ、一部の単語のコピーを作成し、ロックを解除してから、コピーされた単語をチェックする必要がありますバックグラウンド。ロックを保持しているときにそれを強制終了した場合、入力しようとするとすぐに他のスレッドがハングします。マルチスレッドアプリケーションは、このような相互依存関係に満ちています。
-psusi

6

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


そして、コマンドラインから他のシグナルを送信するのはどうですか?
ユーサー

@yucer私はあなたが何を求めているのか理解していない。
デビッドシュワルツ

「kill -l」で表示されるリストから別のシグナルを送信することを意味します。特定のスレッドにコマンドを実行してスタックトレースをダンプする方法を探しています。
ユーサー

@yucerこれはプラットフォーム固有のものになります。特定のスレッドにスタックをダンプするように命令する方法を提供するものもあります。個人的には、スクリプトを使用してデバッガー(などgdb)をプロセスにアタッチし、すべてのスレッドにコマンドを実行してスタックをダンプしてからデタッチする方が簡単だとわかりました。
デビッドシュワルツ

1

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

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


1

tgkill()が役立つ場合があります。manページで言及されているように、Linux固有です。

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


これは、スレッドにシグナルを送信する方法ではなく、スレッドを強制終了する方法に関する質問には対応していません。
デビッドシュワルツ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.