1. 程序验证内容
将编号为0,1,2添加到阻塞信号集中,i<信号编号时,发出信号,观察未决信号集状态
当解除阻塞后,原先的信号是否执行,执行顺序是什么
2. 代码实现
#include <unistd.h>
#include <stdlib.h>
#include <signal.h>
using namespace std;
void signal_handler(int signo)
{
if (signo == SIGINT)
{
printf("recv SIGINT\n");
}
else if (signo == SIGQUIT)
{
printf("recv SIGQUIT\n");
}
}
int main(){
sigset_t myset, old;
sigemptyset(&myset);// 清空
// 添加要阻塞的信号
sigaddset(&myset, SIGINT);//ctrl+c
sigaddset(&myset, SIGQUIT);//ctrl+\//
sigaddset(&myset,SIGTHUP);
// 自定义信号集设置到内核中的阻塞信号集
sigprocmask(SIG_BLOCK, &myset, &old);
sigset_t pend;
int i = 0;
while (1)
{
sleep(1);
// 读内核中的未决信号集的状态
sigpending(&pend);
//用来判断SIGHUP是否在pending
/* if (i == SIGHUP)
{
if (sigismember(&pend, SIGHUP))
{
printf("SIGHUP is pending\n");
}
else
{
printf("SIGHUP is not pending\n");
}
}*/
if (sigismember(&pend, i))
{
printf("1 i_number=%d",i);
}
else if (sigismember(&pend, i) == 0)
{
printf("0 i_number=%d",i);
}
printf("\n");
/*//验证阻塞结束后先执行SIGQUIT还是SIGINT
signal(SIGQUIT,signal_handler);
signal(SIGINT,signal_handler);*/
sleep(1);
i++;
//执行11次后,解除阻塞,看程序状态
if (i > 10)
{
sigprocmask(SIG_SETMASK, &old, NULL);
}
}
return 0;
}
3. 执行结果
4. 中间遇到的问题:
为什么i=0时,sigismember(&pend,i)==1?
信号编号 0 是一个特殊的值,代表空信号,通常用来检查信号集的成员资格而不是实际的信号
因此表示空信号在未决信号集中
为什么无论先键入ctrl+c还是ctrl+\ ,都是先执行SIGQUIT?
因为在Linux中,SIGQUIT的优先级比SIGINT高