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


13

ここに画像の説明を入力してください

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


Packet Recieverプログラムとは何ですか?(Debianデスクトップにはありません)詳細を教えてください。おそらくリンクを提供してください。だから、あなたの質問を編集改善すること。
バジルスタリンケビッチ

1
どのスレッドに送信するかに関係なく、「停止」シグナルがプロセスを停止することを理解していないと思います。
デビッドシュワルツ


1
@ Md.Kawsaruzzamanそれはうまくいきません。たとえば、スレッドがメモリを割り当てている最中で、メモリアロケータのロックを保持しているとします。スレッドを停止すると、ロックは解除されず、最終的に他のスレッドも停止します。何をしようとしても、これはそれを行う方法ではありません。(スレッドの実行中の作業を停止したい場合があります。しかし、それを行うにはプロセスの協力が必要です。実行する方法が提供されない場合、実行できません。)
Davidシュワルツ

1
また、スクリーンショットでは、すべての「スレッド」に個別のPIDがあることに注意してください。シグナルはプロセスにのみ送信される可能性があるため、個別のスレッドをターゲットにできるかどうかはわかりません。
szalski

回答:


16

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

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

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


5
これはまったく役に立ちません。OPは、スレッドを強制終了するかどうかではなく、スレッドを強制終了する方法を求めています。
マーティン

私が欲しいのは、何らかの目的で特定のスレッドを強制終了または停止するプロセスです。何らかのエラーが原因で、レシーバーが自動的にシャットダウンされることがあると思います。プログラムは私たち自身のR&Dによって開発されているため、原因を見つけています。今では、一部のスレッドが自動的にシャットダウンされる可能性があります。私たちは、コード側からテストされ、その子スレッドを持っている独立したが、サーバ側からまだ...総プロセスもシャットダウンさせる時々ダウンいくつかのスレッドを得る
。メリーKawsaruzzaman

12

あなたは使用することがありますtgkill(2)またはtkillCプログラムでは、(あなたが使用する必要がありますのsyscall(2) )が、あなたはしたくありません。プログラム内からpthread_kill(3)を使用できます-これはめったに役立ちません。

(スレッドにどのような効果があるのtgkilltkillSIGKILLまたはSIGTERM- と一緒に-など)

pthreads(7)ライブラリの使用、低レベルのもの(一部を含む信号(7) -sとのfutex(7) -s等...;も参照(7)NPTL)、あなたは生殺した場合は(とtkilltgkill)いくつかの個々のスレッドでは、一部の内部不変式が破損するため、プロセスは何らかの誤った状態になります(したがって未定義の動作)。

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

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

そして実際には、シグナルとスレッドはうまく結婚しません。pthreadのチュートリアルを読んでください

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


4
このtgkill関数は、スレッドを終了する方法を提供しません。スレッドにシグナルを送信します。プロセスを強制終了する歴史的な方法であり、スレッドの強制終了には使用できないため、「kill」という名前が付けられています。
デビッドシュワルツ

SIGKILLスレッドにを送信することは、それを害していると思います。それとも、常にプロセス全体を殺していますか?そして、どうSIGTERMですか?ところで、たとえスレッドだけが害を受けたとしても、私のポイントはプロセスが悲惨な状態にあるということです。
バジルスタリンケビッチ

5
はい、プロセスを強制終了または終了するためのSIGKILLand SIGTERMシグナルが定義されています。それは、どのスレッドがそれらを受け取るかに関係なく当てはまります-それらはまだ同じことを意味します。プロセスの緊密な協力なしにスレッドを終了することは、くだらないシュートであり、プロセスに壊滅的な影響を与える可能性があります。
デビッドシュワルツ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.