分段错误处理程序中的分段错误

时间:2012-08-13 14:08:14

标签: linux segmentation-fault

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

2 个答案:

答案 0 :(得分: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;
}

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

答案 1 :(得分:1)

来自C-11标准,7.14.1.1

  

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

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

但是如果一个段错误处理程序本身就是一个混乱的话,那就太乱了:)