sigaddset,sigprocmask, sigpending ...

#include <signal.h>

typedef void (*sighandler_t)(int);

sighandler_t signal(int signum, sighandler_t handler);

int sigemptyset(sigset_t *set);                              

int sigfillset(sigset_t *set);

int sigaddset(sigset_t *set, int signum);

int sigdelset(sigset_t *set, int signum);

int sigismember(const sigset_t *set, int signum);

int sigpending(sigset_t *set);

 

上面几个函数都可以鉴名思意,下面就简单介绍一下用法,帮助快速理解和记忆

这几个函数组合起来一般是用来延迟信号处理,即进程收到指定信号时不立即处理信号事件,而是待调用sigpending时再处理

使用流程一般为:

1、设置信号处理方法        signal

2、初始化待设置信号集     sigemptyset(全部清0) 或 sigfillset(全部置1)

3、添加待设置信号集        sigaddset

4、设置信号屏蔽              sigprocmask

5、进程休眠或处理其他事件

6、查看捕获到的被延迟的信号    sigpending

7、还原初始信号集           sigprocmask

 

示例代码如下:

 

 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     sigset_t newsigset, oldsigset, pendsigset;
10     //1-设置捕获信号
11     signal(SIGINT, sigfunc);
12     //2-初始化信号集
13     sigemptyset(&newsigset);
14     //3-添加待处理信号集
15     sigaddset(&newsigset, SIGINT);
16     //4-设置阻塞信号集
17     sigprocmask(SIG_BLOCK, &newsigset, &oldsigset);
18     //5-休眠
19     for (int i=0; i<5; ++i)
20     {
21         printf("sleeping %d\n", i);
22         sleep(1);
23     }
24     //6-检查获取到的被阻塞的信号集
25     sigpending(&pendsigset);
26     printf("SIGINT is blocked %d\n", sigismember(&pendsigset, SIGINT));
27     //7-还原被屏蔽的信号集
28     printf("recover signal \n");
29     sigprocmask(SIG_SETMASK, &oldsigset, 0);
30     return 0;
31 }
32 
33 void sigfunc(int signum)
34 {
35     printf("catch SIGINT | signum = %d\n", signum);
36 }

 

 测试结果:

sleeping 0
^Csleeping 1
sleeping 2
sleeping 3
sleeping 4
SIGINT is blocked 1
recover signal
catch SIGINT | signum = 2

posted @ 2015-03-14 14:08  debugxy  阅读(242)  评论(0编辑  收藏  举报