对于在 Linux 下的段错误处理程序中发生的段错误,是否有一些已定义的行为? 是否会再次调用同一个处理程序?如果是这样,在所有平台上,它是否被定义等等。 谢谢。
最佳答案
答案取决于您如何安装信号处理程序。如果您使用已弃用的 signal()
安装信号处理程序调用,然后它将信号处理程序重置为默认处理程序或在调用信号处理程序之前阻止正在处理的信号。如果它阻塞了信号,它将在您的信号处理程序返回后解除阻塞。
如果您使用 sigaction()
,您可以控制在调用信号处理程序时阻止哪些信号。如果这样指定,有可能造成无限递归。
可以围绕 sigaction()
实现一个安全包装器,它具有类似于 signal()
的 API:
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;
}
这会在信号处理程序调用期间阻塞所有信号,并在信号处理程序返回后恢复。
关于linux - 段错误处理程序中的段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11936020/