SIGINT
プログラムを中断できるようにフックしたマルチスレッド (pthreads) アプリケーションがあります。次のようにシグナルハンドラスレッドを設定しました。
/*** startup code ***/
// Prep signal-related stuff:
signal(SIGPIPE, SIG_IGN);
sigset_t set;
sigemptyset(&set);
sigaddset(&set, SIGINT);
assert(0 == pthread_sigmask(SIG_BLOCK, &set, NULL));
// Spawn signal handling thread
pthread_t sig_pthread;
pthread_create(&sig_pthread, NULL, &sig_thread, (void *) &set);
シグナル ハンドラ スレッドは次のとおりです。
static void* sig_thread(void *arg) {
sigset_t *set = (sigset_t *) arg;
int s, sig;
#ifndef __APPLE__
prctl(PR_SET_NAME, "signal hander", 0, 0, 0);
#endif
for (;;) {
s = sigwait(set, &sig);
if (s != 0) {
ERR(E_UNKNOWN, "sigwait failed?\n");
/* ERR is macro -> exit(E_UNKNOWN) */
}
if (sig == SIGINT) {
...
} else {
ERR(E_UNKNOWN, "caught unknown signal %d\n", sig);
/* ERR is macro -> exit(E_UNKNOWN) */
}
}
}
正常に実行されている場合、コードは期待どおりに機能します。ただし、gdb でプログラムを実行すると、次のようになります。
--- E: caught unknown signal 4611
(10 進数の) 値 4611 (0x1203, 01103) について洞察を持っている人はいますか? では明らかなことではありませんでしたsignal.h
。これを引き起こすためにgdbが何をしているのか、そしてそれを修正/防止する方法を知っている人はいますか?