首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 操作系统 > UNIXLINUX >

关于信号阻塞,信号未决的代码,不明白解决方法

2012-02-08 
关于信号阻塞,信号未决的代码,不明白C/C++ code5 #includeapue.h6 static void sig_quit(int)78 int ma

关于信号阻塞,信号未决的代码,不明白

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");啊

热点排行