我正在使用sigprocmask,如下所示:
void mask(){
sigset_t new_set,old_set;
sigemptyset(&new_set);
sigaddset(&new_set,SIGALRM);
sigprocmask(SIG_BLOCK, &new_set, &old_set);
}
令我惊讶的是,即使我在开头调用了mask(),打印大列表的函数也会被信号中断。 它看起来好像是掩码失败,因为我的函数不会调用任何其他函数,因此在运行时不会发生unmask()。 什么可能导致sigprocmask失败?
答案 0 :(得分:1)
从POSIX spec,sigprocmask()
返回-1并且如果失败则设置errno。如果您发布的代码是您正在使用的代码,那么您显然不会检查它是否成功。
如果sigprocmask()
成功,并且确实SIGALRM
正在中断正在调用mask()
的函数,则非常很有可能在该函数中,处理该信号的方式不同。
你可以在调用raise(SIGALRM)
之后立即执行mask()
,如果忽略它,那么下面的其他一些函数就会改变行为。
正如评论中提到的bmargulies(可能应该是答案),您可以使用strace
查看是否确实如此,如果适用于ltrace
它逐步通过库调用。
当您使用在安装处理程序时粗鲁的库(例如,检查信号是否被忽略,或在修改行为之前在别处处理)时,这并不罕见。