我在How to block all SIGNALS in thread WITHOUT using SIGWAIT?写了一个类似的问题,但必须承认我仍然需要100%清晰的主题...... C不是我的日常工作;-)对不起,类似的问题....
所有我需要100%澄清的是:
我想阻止所有信号进入我创建的线程,但我想在MAIN线程中捕获下面提到的信号,因此在创建线程后捕获SIG_UNBLOCK。 / p>
同样非常重要的是防止对我无法控制的库的任何中断在SIGINT期间被“干扰”。我有一种情况,在“从队列中获取消息GET”的线程中发生了WAIT步骤。即使信号处理程序在main中定义,因此等待步骤似乎拒绝SIGINT,因此下面是SA_RESTART。
如果下面的代码可以完成此操作,请告诉我们吗?我很确定没问题。
感谢您的帮助,非常感谢
林顿
以下是MAIN计划的片段:
int main(int argc, char * argv[]){
sigset_t set;
struct sigaction sa_shutdown;
struct sigaction sa_error;
//Shutdown hook for CTRL-C
sa_shutdown.sa_handler = shutdownHook;
sigemptyset(&sa_shutdown.sa_mask);
sa_shutdown.sa_flags = SA_RESTART;
sigaction(SIGINT, &sa_shutdown, NULL);
//Error handlers for erroneous signals
sa_error.sa_handler = signalErrorHandler;
sigemptyset(&sa_error.sa_mask);
sa_error.sa_flags = SA_RESTART;
sigaction(SIGSEGV, &sa_error, NULL);
sigaction(SIGBUS, &sa_error, NULL);
sigaction(SIGILL, &sa_error, NULL);
sigaction(SIGTERM, &sa_error, NULL);
sigaction(SIGABRT, &sa_error, NULL);
//BLOCK all SIGNALS in threads
sigfillset(&set);
rc = pthread_sigmask(SIG_BLOCK, &set, NULL);
if(rc != 0){
printf("Thread sigmask failed\n");
exit(1);
}
rc = pthread_create(&outboundThread, NULL, outboundThreadMainLoop, (void *)argv);
if(rc != 0){
printf("Thread creation failed\n");
exit(1);
}
pthread_sigmask(SIG_UNBLOCK, &set, NULL);
pthread_join(outboundThread, NULL);
return 0;
}
答案 0 :(得分:0)
关于阻止所有信号,你的代码看起来还不错。
无论如何,我要说你不应该阻止SIGFPE,SIGILL,SIGSEGV或SIGBUS。
pthread_sigmask()
的手册页说:“如果在阻塞时生成任何SIGFPE,SIGILL,SIGSEGV或SIGBUS信号,结果是不确定的,除非信号是由kill()函数,sigqueue()函数或raise()函数。“
关于“ ...对库的中断...... ”:如果你指的是从你在你的例子中创建的线程中对库的任何调用,我也会说没关系,他们不会被打断。