关于信号阻塞,信号未决的代码,不明白解决方法
关于信号阻塞,信号未决的代码,不明白
执行结果为什么是这样的,
$./a.out
^\ 产生信号一次(在5s之内)
SIGQUUIT pending
caught SIGQUIT 这个地方很不明白,caught SIGQUIT 是信号处理程序输出的,但是不是已经阻塞了吗?怎么还会调用信号处理程序呢
SIGQUIT unblocked 如果前面调用了信号处理程序,这里我就明白了,unlock后就可以调用默认动作了
^\退出
------解决方案--------------------
没有问题啊, 信号一直阻塞, 解开的一瞬间打印printf("caught SIGQUIT\n");, 然后执行到 printf("SIGQUIT unblocked\n");啊
- C/C++ code
5 #include"apue.h" 6 static void sig_quit(int); 7 8 int main(void) 9 { 10 sigset_t newmask,oldmask,pendmask; 11 12 if(signal(SIGQUIT,sig_quit) == SIG_ERR) 13 err_sys("can't catch SIGQUIT"); 14 15 sigemptyset(&newmask); 16 sigaddset(&newmask,SIGQUIT); 17 18 if(sigprocmask(SIG_BLOCK, &newmask, &oldmask) < 0) 19 err_sys("SIG_BLOCK error"); 20 21 sleep(5); 22 23 if(sigpending(&pendmask) < 0) 24 err_sys("sigpending error"); 25 if(sigismember(&pendmask, SIGQUIT)) 26 printf("\nSIGQUIT pending\n"); 27 28 if(sigprocmask(SIG_SETMASK, &oldmask, NULL) <0) 29 err_sys("SIG_SETMASK error"); 30 printf("SIGQUIT unblocked\n"); 31 sleep(5); 32 exit(0); 33 } 34 static void sig_quit(int signo) 35 { 36 printf("caught SIGQUIT\n"); 37 if(signal(SIGQUIT, SIG_DFL) == SIG_ERR) 38 err_sys("can't reset SIGQUIT"); 39 } ~
执行结果为什么是这样的,
$./a.out
^\ 产生信号一次(在5s之内)
SIGQUUIT pending
caught SIGQUIT 这个地方很不明白,caught SIGQUIT 是信号处理程序输出的,但是不是已经阻塞了吗?怎么还会调用信号处理程序呢
SIGQUIT unblocked 如果前面调用了信号处理程序,这里我就明白了,unlock后就可以调用默认动作了
^\退出
------解决方案--------------------
没有问题啊, 信号一直阻塞, 解开的一瞬间打印printf("caught SIGQUIT\n");, 然后执行到 printf("SIGQUIT unblocked\n");啊