分段故障处理程序中分割故障(Segmentation fault within segmentati

2019-09-21 04:05发布

是否有分割故障恰好在Linux下分割falut处理程序中的一些定义的行为? 将有另一种调用相同的处理? 如果是这样,在所有平台上,它是定义等等。 谢谢。

Answer 1:

比答案取决于你如何安装信号处理程序。 如果您使用过时的安装信号处理程序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;
}

此块的信号处理程序调用,这将会信号处理程序返回后恢复期间的所有信号。



Answer 2:

C-11标准, 7.14.1.1

当信号发生和FUNC指向一个函数,它是实现定义信号的等价(sig,SIG_DFL)是否; 被执行或实施防止一些实现定义的一组信号( 至少包括SIG)的发生,直到当前的信号处理已完成;

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

但它的一塌糊涂,如果段错误处理程序本身:)段错误



文章来源: Segmentation fault within segmentation fault handler