码迷,mamicode.com
首页 > 其他好文 > 详细

sigsuspend函数

时间:2016-02-05 18:55:40      阅读:216      评论:0      收藏:0      [点我收藏+]

标签:

 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      

sigsuspend函数

标签:

原文地址:http://www.cnblogs.com/wireless-dragon/p/5183190.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!