Unix(Posix)プロセスがシグナルを受信すると、シグナルハンドラが実行されます。
マルチスレッドプロセスでは何が起こりますか?どのスレッドが信号を受信しますか?
私はこの問題を処理するためにシグナルAPIを拡張する必要があると思います(つまり、シグナルハンドラのスレッドを決定できるはずです)。しかし、オンラインで情報を検索してみると、Linuxカーネルメーリングリストや他のフォーラムで1年以上の議論がありました。 。私が理解している限り、Linusの概念はPosix標準とは異なり、いくつかの互換性層が最初に構築されましたが、Linuxはposixモデルに従います。
現状はどうですか?
ベストアンサー1
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 はプロセス指向信号の概念をサポートしていません。シグナルは特定のスレッドにのみ送信できます。