我一直致力于Linux下的多线程程序,并对信号处理有特殊要求。 例如,我需要程序来打印单个Ctrl-C输入的统计信息。
我使用pthread_sigmask和sigwait实现了这一点,即在创建其余线程之前阻止主线程中的所有非关键信号,并在sigwait上启动一个“catcher”线程。
初始化(主要):
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例程)。 我该如何解决这个问题?
由于
答案 0 :(得分:6)
在添加gdb之前,请尝试将程序暂停SIGSTOP
(而不是SIGINT
)。 SIGSTOP
无法被捕获或忽略,它将暂停您的程序,直到gdb附加到它(然后可以继续)。