The following comment在Breakpad中表明,重置信号处理程序会强制重新抛出信号。但是,我找不到在线描述此行为的任何文档。
另外,the comment here表示一旦信号处理程序返回,信号将被重新抛出。这也是由于信号处理程序已还原或重置为默认值吗?
建议重置信号处理程序以强制重新抛出信号
说一旦信号处理程序返回,信号将被重新抛出
都不是真的。但是,我不认为这就是评论所暗示的意思。可能的情况是,在某些情况下,它会使信号未经处理。因此,触发信号的原始问题会再次触发相同的信号。考虑这个例子:
#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就会反复触发。我认为这是那些评论中提到的方案。
同样,当信号被阻止时,它们将被排队,并在它们被解除阻止后发送到进程。他们在installing their signal handler时屏蔽了它。这可能是第二条评论所指的内容。也可以通过sigprocmask
或pthread_sigmask
进行遮罩。