web-dev-qa-db-ja.com

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

Unix(Posix)プロセスがシグナルを受信すると、シグナルハンドラーが実行されます。

マルチスレッドプロセスではどうなりますか?どのスレッドがシグナルを受信しますか?

私の意見では、シグナルAPIはそれを処理するように拡張する必要があります(つまり、シグナルハンドラーのスレッドを決定できるはずです)が、ネット上の情報を探すのはLinuxカーネルのメーリングリストとさまざまなフォーラム。私が理解したように、LinusのコンセプトはPosix標準とは異なり、最初にいくつかの互換層が構築されましたが、現在Linuxはposixモデルに従います。

現在の状況は?

「根拠:システムインターフェイスの一般情報」の「 Signal Generation and Delivery 」に関するPOSIXのエントリには、

プロセスに対して生成されたシグナルは、1つのスレッドにのみ配信されます。したがって、複数のスレッドがシグナルを受信する資格がある場合は、1つを選択する必要があります。スレッドの選択は完全に実装に任されており、準拠する実装の可能な範囲をできるだけ広くすることと、異なるスレッド間で配信の容易さに違いがある場合に実装に信号を「可能な限り簡単な」スレッドに配信する自由を与えることの両方を行います。

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

シグナルは、プロセス全体(例: kill(2) を使用して送信された場合)または特定のスレッド(例:特定のシグナル、 pthread_kill(3) )を使用して特定のスレッドをターゲットとする信号と同様に、特定の機械語命令を実行した結果として生成されたSIGSEGVおよびSIGFPEはスレッド指向です。プロセス向けのシグナルは、現在シグナルがブロックされていないスレッドのいずれかに配信されます。複数のスレッドでシグナルのブロックが解除されている場合、カーネルはシグナルを配信する任意のスレッドを選択します。

そして pthreads(7)

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

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

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

(現時点では、マルチプロセッサマシンで複数のスレッドが同時に実行されている場合の処理​​方法を認識していません)

古いPOSIXスレッドのLinuxThread実装では、シグナルのターゲットとなる個別の単一スレッドのみが許可されていました。 Linuxシステムの pthreads(7) から:

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

10
Kusalananda