1.sigprocmask函数使用介绍
int sigprocmask(int how, const sigset_t *set, sigset_t *oldset);
- 功能:将自定义信号集中的数据设置到内核中(设置阻塞,解除阻塞,替换)
- 参数:
- how : 如何对内核阻塞信号集进行处理
SIG_BLOCK: 将用户设置的阻塞信号集添加到内核中,内核中原来的数据不变
假设内核中默认的阻塞信号集是mask, mask | set
SIG_UNBLOCK: 根据用户设置的数据,对内核中的数据进行解除阻塞
mask &= ~set
SIG_SETMASK:覆盖内核中原来的值
- set :已经初始化好的用户自定义的信号集
- oldset : 保存设置之前的内核中的阻塞信号集的状态,可以是 NULL
- 返回值:
成功:0
失败:-1
设置错误号:EFAULT、EINVAL
int sigpending(sigset_t *set);
- 功能:获取内核中的未决信号集
- 参数:set,传出参数,保存的是内核中的未决信号集中的信息。
2.sigpromask函数使用
#include <iostream>
#include <signal.h>
#include <cstdlib>
#include <unistd.h>
using namespace std;
int main()
{
sigset_t set;
sigemptyset(&set);
sigaddset(&set, SIGINT);
sigaddset(&set, SIGQUIT);
int ret = sigprocmask(SIG_BLOCK, &set, NULL);
if (ret == -1)
{
perror("sigprocmask");
exit(0);
}
int num = 0;
while (1)
{
num ++ ;
sigset_t pending;
sigemptyset(&pending);
sigpending(&pending);
for (int i = 1; i <= 31; i ++ )
{
int sigRet = sigismember(&pending, i);
if (sigRet == 1)
cout << 1;
else if (sigRet == 0)
cout << 0;
else if (sigRet == -1)
{
perror("sigismember");
exit(0);
}
}
cout << endl;
if (num == 20)
{
ret = sigprocmask(SIG_UNBLOCK, &set, NULL);
if (ret == -1)
{
perror("sigprocmask");
exit(0);
}
}
sleep(1);
}
return 0;
}