考虑以下程序:
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吗?通过假设在从内核模式进入用户模式的过程中不会处理阻塞信号,我是否误解了阻塞信号意味着什么?
最佳答案
@Useless正确地回答了这个问题,说明你是通过将一个未初始化的指针传递给sig *函数来调用UB的.
至于为什么它的工作原理并且没有崩溃或者没有阻止SIGINT如果你添加这条线就可以清楚 –
printf("%p",ss);
这很可能是打印(零)或0.
幸运的是,未初始化的变量设置为NULL,并且来自sigprocmask
的文档
If
set
isNULL
,then the signal mask is unchanged (i.e.,how is@H_404_35@ ignored),but the current value of the signal mask is nevertheless@H_404_35@ returned inoldest
(if it is notNULL
).
因此,您对SIGINT的阻止实际上被忽略了.但是,如果你不幸运的话,你也可能会看到崩溃或其他一些(甚至是正确的行为).