什么时候信号会自动重新抛出?

When does a signal get automatically rethrown?

breakpad 中的

The following comment 建议重置信号处理程序会强制重新抛出信号。但是,我无法在网上找到任何描述此行为的文档。

此外,the comment here 表示一旦信号处理程序 returns,信号将被重新抛出。这也是信号处理程序恢复或重置为默认值的结果吗?

suggests that resetting the signal handler forces the signal to be rethrown

says once the signal handler returns, the signal will be rethrown

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

#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 在这里并没有真正“处理”。因此,一旦控制 returns 从信号处理程序返回,SIGPFE 就会重复触发。我相信这是那些评论中提到的场景。

类似地,当信号被阻塞时,它们将被排队并在它们被解除阻塞后发送到进程。他们在 installing their signal handler 时掩盖了它。 这可能是第二条评论所指的内容。屏蔽也可以通过 sigprocmaskpthread_sigmask.

完成