查询搁置(屏蔽)信号集
sigpending函数
头文件#include <signal.h>
int sigpending(sigset_t *set);
@set:用于存储查询到的未处理的信号
成功返回 0
#include <stdio.h>
#include <signal.h>
#include <unistd.h>
#include <stdlib.h>
void sigfun(int args)
{
printf("%s %d start\n", __func__, __LINE__);
if (SIGINT == args)
printf("this signal is SIGINT\n"); //ctrl+c
else if (SIGQUIT == args)
printf("this signal is SIGQUIT\n"); //ctrl+/
printf("%s %d stop\n", __func__, __LINE__);
}
int main()
{
printf("%s %d start\n", __func__, __LINE__);
//注册信号处理方式
signal(SIGINT, sigfun);
signal(SIGQUIT, sigfun);
//查询当前进程号
int i;
for (i = 0; i < 5; i++)
{
printf("current pid = %d,i = %d\n", getpid(), i);
sleep(1);
}
//将SIGINT与SIGQUIT添加到信号集中
sigset_t newset = {0}, oldset = {0}, retset = {0}; //定义信号集
sigaddset(&newset, SIGINT);
sigaddset(&newset, SIGQUIT);
//屏蔽信号
printf("after sigprocmask block\n");
sigprocmask(SIG_SETMASK, &newset, &oldset); //屏蔽SIGINT
for (i = 0; i < 5; i++)
{
printf("current pid = %d,i = %d\n", getpid(), i);
sleep(1);
}
//查询搁置信号集
if (sigpending(&retset) < 0)
{
perror("sigpending error");
return -1;
}
//判断信号集中是否有SIGINT和SIGQUIT信号
if(sigismember(&retset,SIGINT))
printf("retset have SIGINT\n");
else
printf("retset not have SIGINT\n");
if(sigismember(&retset,SIGQUIT))
printf("retset have SIGQUIT\n");
else
printf("retset not have QUIT\n");
//解屏蔽
printf("after sigprocmask unblock\n");
sigprocmask(SIG_SETMASK,&oldset,NULL); //解屏蔽SIGINT
for(i = 0; i < 5; i++)
{
printf("current pid = %d,i = %d\n",getpid(),i);
sleep(1);
}
if(sigpending(&retset) < 0)
{
perror("sigpending error");
return -1;
}
if(sigismember(&retset,SIGINT))
printf("retset have SIGINT\n");
else
printf("retset not have SIGINT\n");
if(sigismember(&retset,SIGQUIT))
printf("retset have SIGQUIT\n");
else
printf("retset not have QUIT\n");
printf("%s %d stop\n",__func__,__LINE__);
}