「根拠:システムインターフェイスの一般情報」の「信号の生成と配信」に関する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はプロセス指向のシグナルの概念をサポートしていません。シグナルは特定のスレッドにのみ送信できます。