システムシグナル (SIGINT など) をインターセプトする必要があるマルチスレッドプログラムをプログラミングしています。次のようなこれらのシグナルを「キャッチ」する正規化された方法があるかどうかを知りたいです。
- Signal が送信されました。任意のスレッドがそれを受信できますか、それとも main() のみが受信できますか?
- これを処理する方法を指定するPosixルールまたはプログラミングイディオムはありますか?
正確に 1 つのスレッドがシグナルを受信することが保証されていますが、それがどのスレッドであるかも特定されていません。
適切なことは、1 つを除くすべてのスレッドでシグナルをブロックして、そのスレッドだけがシグナル処理を処理するようにすることです。または Linux では、具体的にどこでもスレッドをブロックし、signalfd をセットアップしてシグナルをキャッチします。これにより、非同期性が導入されず、シグナルが読み取られるファイル記述子が 1 つ増えるだけになります。
POSIXについてお聞きしたので man signal(7)より
POSIX.1 では、プロセス全体に向けられるシグナルと、個々のスレッドに向けられるシグナルの概念が区別されます。 POSIX.1 によると、プロセス向けのシグナル (たとえば、kill(2) を使用して送信される) は、プロセス内で任意に選択された単一のスレッドによって処理される必要があります。
つまり、シグナルを処理するためにランダムなスレッドが選択されることを意味します。