Linuxのプロセスでシングルスレッドを終了するには?

Linuxのプロセスでシングルスレッドを終了するには?

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

これはパケット受信者プロセスの個々のスレッドです。シングルスレッドを終了する方法はありますか? Linuxは、プロセスの下の特定のスレッドを終了するか、プロセスの下の特定のスレッドに停止信号を送信する特定のコマンドを提供しますか?

答え1

より大きなプロセスで単一スレッドを終了することはしばしば非常に危険です。このスレッドは次のことができます。

  • 他のスレッドと共有されるいくつかの破損している可能性がある状態を修正
  • 決して解放されないいくつかのロックを保持し、ロックを無期限に使用できなくします。
  • ...または他のスレッドにエラーを引き起こす可能性がある他のすべて。

通常、アプリケーション自体の管理と同期を除いて、個々のスレッドを終了することは意味がありません。

答え2

あなたは使用することができますtgkill(2)または、tkillCプログラムで(次を使用する必要があります。システムコール(2))しかし欲しくない。プログラム内で次のものを使用できます。pthread_kill(3)- ほとんど役に立たない。

tgkilltkillたとえば、スレッドでまたはスレッドを使用するなどの影響が何でSIGKILLあるかわかりません)SIGTERM

これ並列スレッド(7)ライブラリは低レベルの項目(一部を含む)を使用します。信号(7)-砂未来繊維(7)-sなど...見てみましょう。NPTL(7))、一部の個々のスレッドを生のシャットダウン(tkillまたは使用tgkill)すると、プロセスは無効な状態になります(したがって未定義の動作)一部の内部不変性が壊れる可能性があるためです。

したがって、パケット受信者プログラムの文書を調べて、他の方法を見つけてください。の場合フリーソフトウェア、ソースコードを研究して改善します。

注意深く読んでください信号(7)そして信号セキュリティ(7)。シグナルは(経由で)プロセスに送信されることが意図されています。殺す(2))スレッドで処理されます。

実際、信号とスレッドは一緒にうまく動作しません。少し読んでくださいスレッドのチュートリアル

マルチスレッドプログラムを書くときによく使われるトリックです。外部)などの信号がSIGTERM使用されます。パイプ(7)独自のプロセスと世論調査(2)パイプは別のスレッドにあります(Linux固有を考慮することもできます)。signalfd(2))、シグナルハンドラを使用して書き込み(2)- このパイプに1つ以上のバイトを入れます。このよく知られたトリックは、以下でよく説明される。Qtドキュメント(Qtなしで自分のプログラムで使用できます)。

答え3

SIGKILLSIGSYS送信する代わりに(たとえば、)使用されず、ブロック/無視されない他の信号のハンドラをインストールできます。このハンドラでは、通常または関数とは異なり、現在のスレッド(LWP)のみを終了するシステムコールを呼び出すことができます。syscall(SYS_exit, 0)プロセス全体はシステムコールで終了します。exit(int)_exit(int)exitexit_group

pthread_exit(...)システムコールの代わりにコールを検討することもできますが、この関数は非同期的に安全ではないため、コールするとプロセスでセグフォルトが発生する可能性があります。

強制終了スレッドに対する他の回答のすべての警告が適用されます。

関連情報