您的位置:首页 > 其它

sigaddset,sigprocmask, sigpending ...

2015-03-14 14:08 459 查看
#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

示例代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <signal.h>
#include <unistd.h>
void sigfunc(int signum);
int main()
{
sigset_t newsigset, oldsigset, pendsigset;
//1-设置捕获信号
signal(SIGINT, sigfunc);
//2-初始化信号集
sigemptyset(&newsigset);
//3-添加待处理信号集
sigaddset(&newsigset, SIGINT);
//4-设置阻塞信号集
sigprocmask(SIG_BLOCK, &newsigset, &oldsigset);
//5-休眠
for (int i=0; i<5; ++i)
{
printf("sleeping %d\n", i);
sleep(1);
}
//6-检查获取到的被阻塞的信号集
sigpending(&pendsigset);
printf("SIGINT is blocked %d\n", sigismember(&pendsigset, SIGINT));
//7-还原被屏蔽的信号集
printf("recover signal \n");
sigprocmask(SIG_SETMASK, &oldsigset, 0);
return 0;
}

void sigfunc(int signum)
{
printf("catch SIGINT | signum = %d\n", signum);
}


测试结果:

sleeping 0
^Csleeping 1
sleeping 2
sleeping 3
sleeping 4
SIGINT is blocked 1
recover signal
catch SIGINT | signum = 2
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: