9

私のアプリケーションでは、通常、正常に終了するためにインターセプトSIGINTしてSIGTERMシグナルを送信します。

ワーカースレッドがシグナルを「盗む」のを防ぐために、それぞれのエントリポイントでこれを行います。

// Block signals in this thread
sigset_t signal_set;
sigaddset(&signal_set, SIGINT);
sigaddset(&signal_set, SIGTERM);
sigaddset(&signal_set, SIGHUP);
sigaddset(&signal_set, SIGPIPE);
pthread_sigmask(SIG_BLOCK, &signal_set, NULL);

そうしないと、Ctrl+を実行Cすると、ベーススレッドのハンドラーが呼び出されないことがあります(どのスレッドがシグナルを取得するかは指定されていません)。代わりに、シグナルはプロセスを終了します。ワーカースレッド。これは明らかにクールではありません。

したがって、私には1つの信号処理スレッドがあり、他のすべての場所で信号をブロックします。

しかし、他の誰かがこれをしていることに気づいていません。忘れがちで、完全に移植できるわけでもありません。私が見逃しているもっと簡単なトリックはありますか?


参照:

4

1 に答える 1

5

私はそれをするのは完全に合理的なことだと思います。

main他のスレッドが生成される前に、でシグナルをブロックできます。生成されたスレッドは作成者スレッドのシグナルマスクを継承し、シグナル処理スレッドでのみシグナルのブロックを解除できます(そのスレッドが他のスレッドもスポーンする場合にのみ注意してください)。

または、シグナルをどこでもブロックしたままにsigwaitして、シグナル処理スレッドを介してシグナルを明示的に処理することもできます。

于 2012-11-21T22:28:36.093 に答える