Linux下的分段故障处理程序中发生的分段故障是否有一些定义的行为?是否会再次调用同一个处理程序?如果是这样,在所有平台上,它是否已定义等等。谢谢你。
问问题
671 次
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 回答