マルチスレッドLinuxプロセスがシグナルを受け取るとどうなりますか?


20

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

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

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

現在の状態は何ですか?


3
重複stackoverflow.com/questions/11679568/...「pthreadの(7)POSIX.1信号の処分を含むプロセス共有属性のすべてのスレッドを必要とすることを説明」
スティーブ・

@steveありがとう、しかし1)別のSEサイトにあります2)この仕様は明確に指定されていません。つまり、シグナルハンドラーはすべてのスレッドで呼び出されますが、私には少しシュールに思えます。3)その答えは、Linusのモデルが何であったか、および現在使用されている理由/方法を指定していません。
peterh -復活モニカ

回答:


9

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.