4

Linux下的分段故障处理程序中发生的分段故障是否有一些定义的行为?是否会再次调用同一个处理程序?如果是这样,在所有平台上,它是否已定义等等。谢谢你。

4

2 回答 2

2

答案取决于您如何安装信号处理程序。如果您使用已弃用的signal()调用安装了信号处理程序,那么它会将信号处理程序重置为默认处理程序,或者在调用信号处理程序之前阻止正在处理的信号。如果它阻塞了信号,它将在信号处理程序返回后解除阻塞。

如果使用sigaction(),则可以控制在调用信号处理程序时阻止哪些信号。如果您如此指定,则可能导致无限递归。

可以实现一个安全的包装器sigaction(),其 API 类似于signal()

sighandler_t safe_signal (int sig, sighandler_t h) {
    struct sigaction sa;
    struct sigaction osa;
    sa.sa_handler = h;
    sigemptyset(&sa.sa_mask);
    sa.sa_flags = 0;
    if (sigaction(sig, &sa, &osa) < 0) {
        return SIG_ERR;
    }
    return osa.sa_handler;
}

这会在信号处理程序调用期间阻塞所有信号,在信号处理程序返回后恢复。

于 2012-08-13T14:51:11.143 回答
1

C-11标准, 7.14.1.1,

当一个信号出现并且func指向一个函数时,实现定义是否等价于signal(sig, SIG_DFL); 被执行或实现阻止某些实现定义的信号集(至少包括 sig)发生,直到当前信号处理完成;

所以标准说它是实现定义的,它是否允许递归调用相同的信号处理程序。所以我会得出结论,行为已定义,但实现已定义

但是,如果段错误处理程序本身就是段错误,那将是一团糟:)

于 2012-08-13T14:35:10.353 回答