信号何时自动重新抛出?

问题描述 投票:0回答:1

The following comment在Breakpad中表明,重置信号处理程序会强制重新抛出信号。但是,我找不到在线描述此行为的任何文档。

另外,the comment here表示一旦信号处理程序返回,信号将被重新抛出。这也是由于信号处理程序已还原或重置为默认值吗?

signals signal-handling google-breakpad
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就会反复触发。我认为这是那些评论中提到的方案。

同样,当信号被阻止时,它们将被排队,并在它们被解除阻止后发送到进程。他们在installing their signal handler时屏蔽了它。这可能是第二条评论所指的内容。也可以通过sigprocmaskpthread_sigmask进行遮罩。

© www.soinside.com 2019 - 2024. All rights reserved.