#include<iostream>
#include<signal.h>
#include<unistd.h>
#include<vector>
// 定义信号屏蔽常量
#define BLOCK_SIGNAL 2
#define MAX_SIGNUM 31
// 定义需要屏蔽的信号数组
int sigarr[]={2,3,4};
// 展示当前线程未处理的信号状态
static void show_pending(sigset_t &set)
{
int i;
// 遍历并打印每个信号的状态
for(i=1;i<=MAX_SIGNUM;i++)
{
if(sigismember(&set,i))
{
std::cout<<"1";
}else{
std::cout<<"0";
}
}
std::cout<<std::endl;
}
int main()
{
// 屏蔽指定信号
sigset_t block,oblock,pending;
// 初始化信号集
sigemptyset(&block);
sigemptyset(&oblock);
sigemptyset(&pending);
// 添加需要屏蔽的信号到block信号集
for(auto sig:sigarr) sigaddset(&block,sig);
// 应用新的信号掩码,保存旧掩码
sigprocmask(SIG_SETMASK,&block,&oblock);
// 循环打印pending信号集
int cnt = 10;
while(true)
{
// 清空pending信号集
sigemptyset(&pending);
// 获取当前线程未处理的信号状态
sigpending(&pending);
// 展示pending信号状态
show_pending(pending);
sleep(1);
cnt--;
// 恢复原始信号掩码
if(cnt==0)
{
std:: cout<<"恢复信号"<<std::endl;
sigprocmask(SIG_SETMASK,&oblock,&block);
}
}
}