加入收藏 | 设为首页 | 会员中心 | 我要投稿 东莞站长网 (https://www.0769zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 服务器 > 搭建环境 > Linux > 正文

为什么该过程处理阻塞信号?

发布时间:2021-01-11 08:24:10 所属栏目:Linux 来源:网络整理
导读:考虑以下程序: void handler(int signum){ printf("handling %dn",signum);}int main() { signal(SIGINT,handler); sigset_t *ss; sigemptyset(ss); sigaddset(ss,SIGINT); sigprocmask(SIG_BLOCK,ss,NULL); for(;;); return 0;} 在终端中运行该程序后,当

考虑以下程序:

void handler(int signum){
    printf("handling %dn",signum);
}

int main() {
    signal(SIGINT,handler);
    sigset_t *ss;
    sigemptyset(ss);
    sigaddset(ss,SIGINT);
    sigprocmask(SIG_BLOCK,ss,NULL);
    for(;;);
    return 0;
}

在终端中运行该程序后,当我按下ctrl-c时,我总是得到“处理2”作为输出,但我希望没有输出,因为SIGINT先前被阻止了.我错误地阻止了SIGINT吗?通过假设在从内核模式进入用户模式的过程中不会处理阻塞信号,我是否误解了阻塞信号意味着什么? 最佳答案 @Useless正确地回答了这个问题,说明你是通过将一个未初始化的指针传递给sig *函数来调用UB的.

至于为什么它的工作原理并且没有崩溃或者没有阻止SIGINT如果你添加这条线就可以清楚 –

printf("%p",ss);

这很可能是打印(零)或0.

幸运的是,未初始化的变量设置为NULL,并且来自sigprocmask的文档

If set is NULL,then the signal mask is unchanged (i.e.,how is
ignored),but the current value of the signal mask is nevertheless
returned in oldest (if it is not NULL).

因此,您对SIGINT的阻止实际上被忽略了.但是,如果你不幸运的话,你也可能会看到崩溃或其他一些(甚至是正确的行为).

(编辑:东莞站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读