首页 文章

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

提问于
浏览
6

考虑以下程序:

void handler(int signum){
    printf("handling %d\n", 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吗?通过假设在从内核模式进入用户模式的过程中不会处理阻塞信号,我是否误解了阻塞信号意味着什么?

1 回答

  • 2

    @Useless正确回答了这个问题,说明你是通过将一个未初始化的指针传递给 sig* 函数来调用UB的 .

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

    printf("%p", ss);
    

    这很可能会打印 (nil)0 .

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

    如果set为NULL,则信号掩码不变(即,如何忽略),但信号掩码的当前值仍以最旧的方式返回(如果它不是NULL) .

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

相关问题