0

breakpad 中的以下注释表明重置信号处理程序会强制重新抛出信号。但是,我无法在网上找到任何描述此行为的文档。

此外,这里的注释说一旦信号处理程序返回,信号将被重新抛出。这也是信号处理程序恢复或重置为默认值的结果吗?

4

1 回答 1

0

建议重置信号处理程序会强制重新抛出信号

表示一旦信号处理程序返回,信号将被重新抛出

两者都不是真的。但是,我不相信这就是评论所暗示的。可能的情况是它在某些情况下未处理信号。所以触发信号的原始问题再次触发相同的信号。考虑这个例子:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>

void handler(int sig)
{
    write(1, "Received FPE\n", sizeof "Received FPE\n" - 1);
}

int  main(void)
{
    signal(SIGFPE, handler);
    printf("%f", 1/0);
}

(这应该会导致无限循环)。

SIGFPE 在这里并没有真正“处理”。因此,一旦控制从信号处理程序返回,SIGPFE 就会被重复触发。我相信这是那些评论中提到的场景。

同样,当信号被阻塞时,它们将被排队并在解除阻塞后发送到进程。他们在安装信号处理程序时将其屏蔽。这可能是第二条评论所指的内容。掩蔽也可以通过sigprocmask或来完成pthread_sigmask

于 2019-11-14T13:34:56.097 回答