#include
#include
#include
#include
#include
#include
/* Simple error handling functions */
#define handle_error_en(en, msg)
do { errno = en; perror(msg); exit(EXIT_FAILURE); } while (0)
static void * sig_thread(void * arg)
{
printf("pthread_createn");
sigset_t *sigset = (sigset_t *) arg;
int ret,sig;
for(;;) {
printf("signal_handle_threadn");
ret = sigwait(sigset,&sig);
if (ret != 0) {
printf("sigwait failn");
}
printf("signal handling thread get signal %dn",sig);
}
return NULL;
}
int signal_block()
{
sigset_t sigset;
sigemptyset(&sigset);
sigaddset(&sigset, SIGQUIT);
sigaddset(&sigset, SIGUSR1);
sigaddset(&sigset, SIGCHLD);
int ret = pthread_sigmask(SIG_BLOCK, &sigset, NULL);
if (ret != 0) {
printf("pthread_sigmask errorn");
return -1;
}
pthread_t thread;
ret = pthread_create(&thread,NULL,sig_thread,(void*)&sigset);
if (ret != 0) {
printf("pthread create failn");
return -1;
}
return 0;
}
int main(int argc, char *argv[])
{
/*
sigset_t sigset;
sigemptyset(&sigset);
sigaddset(&sigset, SIGQUIT);
sigaddset(&sigset, SIGUSR1);
sigaddset(&sigset, SIGCHLD);
int ret = pthread_sigmask(SIG_BLOCK, &sigset, NULL);
if (ret != 0) {
printf("pthread_sigmask errorn");
return -1;
}
pthread_t thread;
ret = pthread_create(&thread,NULL,sig_thread,(void*)&sigset);
if (ret != 0) {
printf("pthread create failn");
return -1;
}*/
signal_block();
pause(); /* Dummy pause so we can test program */
return 0;
}
上面是可以在linux下直接编译执行的。
上面大段的注释部分和独立函数int signal_block()是一模一样的。
现在问题是:
上面代码编译执行后,在终端上使用kill -USR1 pid / kill -QUIT pid / kill -CHLD pid 有时候无法捕捉相应信号,比较随机。
但是将main函数里上面注释部分解除注释,而将signal_block()这个函数注释,也就是说将signal_block里的功能转移到main函数里逐行逐行来实现,在终端上使用kill -USR1 pid / kill -QUIT pid / kill -CHLD pid ,信号捕获就正常。
请各位高人帮忙解答上述现象的原因,在线等,得到结论马上结单。。。