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+csigaddset(&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还是SIGINTsignal(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高