"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 は、プロセス向けシグナルの概念をサポートしていません。シグナルは特定のスレッドにのみ送信されます。
受け入れられた回答を拡張すると、ここで見つけたより実用的なビューがあります。
本質は次のとおりです。
シグナル ハンドラはプロセスごとですが、シグナル マスクはスレッドごとです。
<オール>tid
で識別) s、スレッド ID) は、マスクされたプロセス (pid
で識別) と見なされます。 s)、および tid
に送信されるシグナル pid
に転送されます .SA_NODEFER
で変更できます sigaction(...)
の旗 SA_NODEFER
で sigaction を設定した場合 、常に同じスレッドがシグナルを受け取り、スタックします .