1 #include <sys/wait.h> 2 #include <unistd.h> 3 #include <sys/types.h> 4 #include <errno.h> 5 #include <signal.h> 6 #include <stdio.h> 7 #include <stdlib.h> 8 9 static void sig_quit(int signo); 10 11 int main() 12 { 13 sigset_t newmask,oldmask,pendmask; 14 if(signal(SIGQUIT,sig_quit) == SIG_ERR) 15 { 16 perror("signal() error"); 17 exit(-1); 18 } 19 sigemptyset(&newmask); 20 //添加一个退出信号 21 sigaddset(&newmask,SIGQUIT); 22 //将newmask信号机设置为阻塞,原信号集保存在oldmask中 23 if(sigprocmask(SIG_BLOCK,&newmask,&oldmask) == -1) 24 { 25 perror("sigprocmask() error"); 26 exit(-1); 27 } 28 sleep(5); 29 //获取阻塞的信号集 30 if(sigpending(&pendmask) == -1) 31 { 32 perror("sigpending() error"); 33 exit(-1); 34 } 35 //判断SIGQUIT是否是阻塞的 36 if(sigismember(&pendmask,SIGQUIT)) 37 printf("\nSIGQUIT is pending.\n"); 38 //回复原理的信号集 39 if(sigprocmask(SIG_SETMASK,&oldmask,NULL) == -1) 40 { 41 perror("sigprocmask() error"); 42 exit(-1); 43 } 44 printf("SITQUIT unblocked\n"); 45 sleep(5); 46 exit(0); 47 } 48 49 static void sig_quit(int signo) 50 { 51 printf("caught SIGQUIT.\n"); 52 if(signal(SIGQUIT,SIG_DFL) == SIG_ERR) 53 { 54 perror("signal() error"); 55 exit(-1); 56 } 57 }
程序执行结果如下:在中断上键入Ctlr+\退出字符。
第二次运行时候,在进程休眠的时候产生多次SIGQUIT信号,但是解除了该信号的阻塞后,只会向进程发送一个SIGQUIT,系统没有对信号进行排队。