标签:
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <string.h> 4 #include <signal.h> 5 #include <unistd.h> 6 void sigfunc(int signum); 7 int main() 8 { 9 int i; 10 sigset_t newsigset, oldsigset, pendsigset; 11 //1-设置捕获信号 12 signal(SIGINT, sigfunc); 13 //2-初始化信号集 14 sigemptyset(&newsigset); 15 //3-添加待处理信号集 16 sigaddset(&newsigset, SIGINT); 17 //4-设置阻塞信号集 18 sigprocmask(SIG_BLOCK, &newsigset, &oldsigset);//先屏蔽SIGINT信号 19 //5-休眠 20 for(i=0;i<6;i++) 21 { 22 printf("sleeping %d\n",i); 23 sleep(1); 24 } 25 //6-检查获取到的被阻塞的信号集 26 sigpending(&pendsigset); 27 printf("SIGINT is blocked %d\n", sigismember(&pendsigset, SIGINT)); 28 //7-还原被屏蔽的信号集 29 printf("recover signal \n"); 30 sigprocmask(SIG_UNBLOCK,&newsigset,&oldsigset);//去除SIGING信号的屏蔽 31 while(1) 32 { 33 printf("i is %d\n",i++); 34 sleep(1); 35 } 36 return 0; 37 } 38 39 void sigfunc(int signum) 40 { 41 printf("catch SIGINT | signum = %d\n", signum); 42 }
程序运行结果如下:
1 sleeping 0 2 sleeping 1 3 ^Csleeping 2 4 sleeping 3 5 sleeping 4 6 sleeping 5 7 SIGINT is blocked 1 8 recover signal 9 catch SIGINT | signum = 2 //被阻塞的信号在阻塞解除后进行信号处理 10 i is 6 11 i is 7 12 i is 8 13 i is 9 14 i is 10 15 i is 11 16 i is 12 17 ^Ccatch SIGINT | signum = 2 //解除信号后的主函数可以进行信号处理 18 i is 13 19 i is 14 20 i is 15 21 ^\Quit (core dumped)
但是这个程序有个弊端,我们为了调试方便,才在最后设置了一个while函数,如果没有while函数,该程序会顺序执行完并且推出。
如果我们想一个函数会阻塞进程直至捕获到信号,使程序不会在捕获信号前直接退出,那该是多好啊?庆幸的是,sigsuspend就是这样的函数。(终于等到你!^◊^)
1 #include <signal.h> 2 #include <stdio.h> 3 #include <string.h> 4 #include <stdlib.h> 5 #include <unistd.h> 6 7 void handler(int signum) 8 { 9 printf("signum=%d\n", signum); 10 } 11 12 int main() 13 { 14 int i; 15 signal(SIGINT, handler); 16 sigset_t newsigset, oldsigset, suspendsigset; 17 sigemptyset(&newsigset); 18 sigemptyset(&suspendsigset); 19 sigaddset(&newsigset, SIGINT); 20 sigaddset(&suspendsigset, SIGUSR1); 21 22 sigprocmask(SIG_BLOCK, &newsigset, &oldsigset); 23 24 for (i=0; i<5; ++i) 25 { 26 printf("sleeping i=%d\n", i); 27 sleep(1); 28 } 29 30 sigsuspend(&suspendsigset); 31 32 sigprocmask(SIG_UNBLOCK, &newsigset, &oldsigset); 33 34 return 0; 35 }
该程序运行的两种不同情况的结果如下:
sleeping i=0
sleeping i=1
sleeping i=2
sleeping i=3
sleeping i=4
^Csignum=2 //看的不那么明显,这是sleeping后一直在等待^C信号,我们输入^C信号后,程序执行信号函数操作并退出!
/test/C_language_pointer/process$ ./sigsuspend
sleeping i=0
sleeping i=1
^Csleeping i=2 //在阻塞中间段发射信号^C后,我们看到直到阻塞完成才执行信号处理函数
sleeping i=3
sleeping i=4
signum=2
标签:
原文地址:http://www.cnblogs.com/wireless-dragon/p/5183190.html