私は、シグナル処理に関する特定の要件を備えた Linux でマルチスレッド プログラムに取り組んできました。たとえば、単一の Ctrl-C 入力の統計を出力するプログラムが必要です。
pthread_sigmask と sigwait を使用してこれを実装しました。つまり、残りのスレッドを作成する前に、メイン スレッドで重要でないシグナルをすべてブロックし、sigwait でブロックされた「キャッチャー」スレッドを開始します。
初期化 (メイン):
sigfillset(&set);
sigdelset(&set, SIGSEGV);
sigdelset(&set, SIGBUS);
sigdelset(&set, SIGILL);
s = pthread_sigmask(SIG_BLOCK, &set, NULL);
if (s != 0)
handle_error_en(s, "pthread_sigmask");
s = pthread_create(&signal_thread, NULL, &sig_thread, (void *) &set);
if (s != 0)
handle_error_en(s, "pthread_create");
キャッチャー スレッド ルーチン:
void *sig_thread(void *arg) {
sigset_t *set = (sigset_t *) arg;
int s, sig;
pthread_detach(pthread_self());
for(;;) {
s = sigwait(set, &sig);
if (s != 0)
handle_error_en(s, "sigwait");
switch(sig) {
case SIGINT:
break;
case SIGTERM:
break;
case SIGUSR1:
break;
case SIGUSR2:
break;
default:
break;
}
}
pthread_exit(NULL);
return NULL;
}
すべてが期待どおりに機能しますが、キャッチ メカニズムにより、GDB がプログラムを一時停止できなくなります (SIGINT ルーチンがトリガーされます)。どうすればこれを修正できますか?
ありがとう