2010-05-26 24 views
0

我使用sigprocmask如下:sigprocmask不工作

void mask(){ 
    sigset_t new_set,old_set; 
    sigemptyset(&new_set); 
    sigaddset(&new_set,SIGALRM); 
    sigprocmask(SIG_BLOCK, &new_set, &old_set); 
} 

让我吃惊它打印的大名单莫名其妙地得到由信号中断,即使我在其开始调用面具()函数。 它看起来好像是面具失败,因为我的函数不会调用任何其他函数,因此无法运行unmask()。 什么会导致sigprocmask失败?

+0

使用strace来检查其他东西是否正在屏蔽? – bmargulies 2010-05-26 06:01:18

回答

1

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

如果sigprocmask()是成功的,它确实是SIGALRM被中断正在调用mask()的功能,还有一个非常好的机会,该函数中的东西正在处理该信号不同。

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

由于bmargulies在评论中指出的(这可能应该是一个答案),你可以使用strace,看看是否确实如此,加上ltrace如果适用于观看步库的调用。

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