sigprocmask不工作

时间:2010-05-26 05:15:42

标签: linux sigprocmask

我正在使用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失败?

1 个答案:

答案 0 :(得分:1)

POSIX specsigprocmask()返回-1并且如果失败则设置errno。如果您发布的代码是您正在使用的代码,那么您显然不会检查它是否成功。

如果sigprocmask()成功,并且确实SIGALRM正在中断正在调用mask()的函数,则非常很有可能在该函数中,处理该信号的方式不同。

你可以在调用raise(SIGALRM)之后立即执行mask(),如果忽略它,那么下面的其他一些函数就会改变行为。

正如评论中提到的bmargulies(可能应该是答案),您可以使用strace查看是否确实如此,如果适用于ltrace它逐步通过库调用。

当您使用在安装处理程序时粗鲁的库(例如,检查信号是否被忽略,或在修改行为之前在别处处理)时,这并不罕见。