一、sigprocmask函数和sigpending函数
int sigprocmask(int how, const sigset_t *set, sigset_t *oldset);
调用函数sigprocmask可以检测或更改(或两者)进程的信号屏蔽字。
参数:
how:如何对内核阻塞信号集进行处理
SIG_BLOC :该该进程新的信号屏蔽字是其当前信号屏蔽字和 set指向信号集的并集。set包含了我们希望阻塞的附加信号。
SIG_UNBLOCK:该进程新的信号屏蔽字是其当前信号屏蔽字和 set所指向信号集的交集。set包含了我们希望解除阻塞的信号。
SIG_SETMASK:该该进程新的信号屏蔽是s e t指向的值
set:以及初始化好的用户自定义的信号集
oldset:保存设置之前的内核在的阻塞信号集的状态,可以是 NULL
返回值
成功: 0
失败: -1 ,设置错误号EFAULT或EINVAL
int sigpending(sigset_t *set);
-功能:获取内核中的未决信号集
-参数:set,传出参数,保存的是内核中的未决信号集中的信息
二、代码示例
#include<stdio.h>
#include<signal.h>
#include<stdlib.h>
#include<unistd.h>
int main()
{
//设置2、3号信号阻塞
sigset_t set;
sigemptyset(&set);
//将2号和3号信号添加到信号集中
sigaddset(&set,SIGINT);
sigaddset(&set,SIGQUIT);
//修改内核中的阻塞信号集
sigprocmask(SIG_BLOCK,&set,NULL);
int num=0;
while(1)
{//获取当前未决信号集的数据
num++;
sigset_t pendingset;
sigemptyset(&pendingset);
sigpending(&pendingset);
//遍历前32
for(int i=1;i<=31;i++)
{
if(sigismember(&pendingset,i)==1)
{
printf("1");
}else if(sigismember(&pendingset,i)==0)
{
printf("0");
}
else
{
perror("sigismermber");
exit(0);
}
}
printf("\n");
sleep(1);
if(num==10)
{//解除阻塞
sigprocmask(SIG_UNBLOCK,&set,NULL);
}
}
return 0;
}
总结
今天主要给大家介绍了sigprocmask函数和 sigpending函数。