私のアプリケーションでは、通常、正常に終了するためにインターセプト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つの信号処理スレッドがあり、他のすべての場所で信号をブロックします。
しかし、他の誰かがこれをしていることに気づいていません。忘れがちで、完全に移植できるわけでもありません。私が見逃しているもっと簡単なトリックはありますか?
参照: