【问题标题】:sigprocmask not workingsigprocmask 不工作
【发布时间】:2011-02-24 00:15:20
【问题描述】:

我使用 sigprocmask 如下:

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

令我惊讶的是,一个打印大列表的函数以某种方式被信号中断,即使我在它的开头调用了 mask()。 看起来好像 mask 失败了,因为我的函数没有调用任何其他函数,因此在它的运行中不会发生 unmask()。 什么会导致 sigprocmask 失败?

【问题讨论】:

  • 使用 strace 检查是否有其他内容正在取消屏蔽?

标签: linux sigprocmask


【解决方案1】:

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

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

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

正如bmargulies 在 cmets 中指出的那样(这可能应该是一个答案),您可以使用strace 来查看是否确实如此,如果适用,还可以使用ltrace 来观察它逐步完成库调用。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-02-08
    • 2010-09-06
    • 2011-01-11
    • 1970-01-01
    • 2018-10-16
    • 2011-11-02
    • 2023-03-09
    相关资源
    最近更新 更多