GNU/Linux >> Linux の 問題 >  >> Linux

シグナルを受け取った場合、マルチスレッドの Linux プロセスはどうなりますか?

"Rationale:System Interfaces General Information" の "Signal Generation and Delivery" に関する POSIX のエントリには、

<ブロック引用>

プロセスに対して生成されたシグナルは、1 つのスレッドにのみ配信されます。したがって、複数のスレッドがシグナルを受信する資格がある場合は、そのうちの 1 つを選択する必要があります。スレッドの選択は完全に実装に委ねられます。これは、適合する実装の可能な限り広い範囲を許可し、異なるスレッド間で配信の容易さに違いがある場合に「可能な限り簡単な」スレッドにシグナルを配信する自由を実装に与えるためです。

signal(7) から Linux システムのマニュアル:

<ブロック引用>

プロセス全体に対してシグナルが生成される (したがって保留中になる) 場合があります (たとえば、kill(2) を使用して送信された場合)。 ) または特定のスレッド (たとえば、特定の機械語命令を実行した結果として生成される SIGSEGV や SIGFPE などの特定のシグナルは、pthread_kill(3) を使用して特定のスレッドを対象とするシグナルであるため、スレッド指向です) )。プロセス向けシグナルは、現在シグナルがブロックされていないスレッドのいずれかに配信される場合があります。複数のスレッドでシグナルのブロックが解除されている場合、カーネルはシグナルを配信する任意のスレッドを選択します。

そして pthreads(7) で :

<ブロック引用>

スレッドには、個別の代替シグナル スタック設定があります。ただし、新しいスレッドの代替シグナルスタック設定は、それを作成したスレッドからコピーされるため、スレッドは最初に代替シグナルスタックを共有します (カーネル 2.6.16 で修正済み)。

pthreads(3) から OpenBSD システムのマニュアル (代替アプローチの例として):

<ブロック引用>

シグナル ハンドラーは通常、現在実行中のスレッドのスタックで実行されます。

(マルチプロセッサ マシンで複数のスレッドが同時に実行されている場合に、これがどのように処理されるかは現在のところわかりません)

POSIX スレッドの古い LinuxThread 実装では、個別の単一スレッドのみをシグナルのターゲットにすることができました。 pthreads(7) から Linux システムの場合:

<ブロック引用>

LinuxThreads は、プロセス向けシグナルの概念をサポートしていません。シグナルは特定のスレッドにのみ送信されます。


受け入れられた回答を拡張すると、ここで見つけたより実用的なビューがあります。

本質は次のとおりです。

シグナル ハンドラはプロセスごとですが、シグナル マスクはスレッドごとです。

<オール>
  • したがって、任意のスレッドに (signal() または sigaction() を使用して) シグナル ハンドラーをインストール/アンインストールすると、すべてのスレッドに影響します。
  • プロセスがシグナルを受け取ると、ハンドラーは単一のスレッドでのみ実行されます。このスレッドはそれらの中から疑似ランダムに選択され、そのシグナルマスクはそれを受け入れます。 私の実験では、常に pid が最小のスレッドであることが示されています。
  • 任意のスレッドに送信されたシグナルは、メイン プロセスに送信されたシグナルと見なされます。したがって、スレッドがシグナルを受け取った場合、他のスレッドがハンドラーを実行する可能性は十分にあります。スレッドのように見える場合に最適です (tid で識別) s、スレッド ID) は、マスクされたプロセス (pid で識別) と見なされます。 s)、および tid に送信されるシグナル pid に転送されます .
  • シグナル ハンドラの実行では、そのシグナル マスクで、指定されたシグナル番号が自動的にマスクされます。これは、シグナル バーストでスタックされたシグナル ハンドラが実行されるのを防ぐためです。これは SA_NODEFER で変更できます sigaction(...) の旗
  • (3) と (4) の結果、シグナル バーストの場合、システムはシグナル ハンドラをおそらく最も並列に分散します。
  • ただし、SA_NODEFER で sigaction を設定した場合 、常に同じスレッドがシグナルを受け取り、スタックします .

  • Linux
    1. Linuxコマンドの最後の&はどういう意味ですか?

    2. Linuxでのセッションの定義は何ですか?

    3. Linuxにはどのようなプロセスキラーがありますか?

    1. Linuxユーザーとは何ですか?

    2. Linux シグナルの基礎 – パート I

    3. 指定したファイルが移動または削除された場合、Linux で開いているファイル ハンドルはどうなりますか

    1. どのプロセスが自分のプロセスにシグナルを送信したかをLinuxで確認するにはどうすればよいですか

    2. Linux での複数スレッドによるシグナル処理

    3. 現在の Linux カーネル ソースは何ですか?