0

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

4

1 回答 1

1

POSIX 规范中,sigprocmask()如果失败,则返回 -1 并相应地设置 errno。如果您发布的代码是您正在使用的代码,那么您显然没有检查它是否成功。

如果sigprocmask()成功,并且确实SIGALRM正在中断正在调用的函数mask(),那么很有可能该函数中的某些东西正在以不同的方式处理该信号。

您可以做的另一件事是raise(SIGALRM)在调用之后立即mask(),如果它被忽略,那么下面的其他一些函数正在改变行为。

正如bmargulies在评论中指出的那样(这可能应该是一个答案),您可以使用它strace来查看是否确实如此,并ltrace在适用的情况下通过库调用来观察它。

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

于 2010-05-26T18:31:37.500 回答