gpt4 book ai didi

c++ - 第二次无法捕获段错误

转载 作者:行者123 更新时间:2023-12-02 16:06:38 25 4
gpt4 key购买 nike

当发生段错误时,我正在尝试重新启动程序。

我有以下最少的可重现代码:-

#include <csignal>
#include <unistd.h>
#include <iostream>

int app();

void ouch(int sig) {
std::cout << "got signal " << sig << std::endl;
exit(app());
}

struct L { int l; };
static int i = 0;

int app() {
L *l= nullptr;
while(1) {
std::cout << ++i << std::endl;
sleep(1);
std::cout << l->l << std::endl; //crash
std::cout << "Ok" << std::endl;
}
}

int main() {
struct sigaction act;
act.sa_handler = ouch;
sigemptyset(&act.sa_mask);
act.sa_flags = 0;
sigaction(SIGKILL, &act, 0);
sigaction(SIGSEGV, &act, 0);
return app();
}

它第一次成功捕捉到 sigsegv 但在打印 2 后,它显示段错误(核心已转储)

1
got signal 11
2
zsh: segmentation fault (core dumped) ./a.out

在 ArchLinux 上用 clang 12.0.1 和 gcc 11.1.0 测试

这是操作系统特有的行为还是我的代码有问题

最佳答案

问题在于,当您通过从 ouch() 内部调用 exit(app()) 重新启动程序时,从技术上讲,您仍然处于信号处理程序内部。信号处理程序被阻塞,直到您从中返回。由于您永远不会返回,因此您无法捕获第二个 SIGSEGV。

如果您得到一个 SIGSEGV,那么确实发生了一些非常糟糕的事情,并且不能保证您可以通过再次调用 app() 来“重新启动”该过程。处理此问题的最佳解决方案是让另一个程序启动您的程序,并在它崩溃时重新启动它。参见 this ServerFault question有关如何处理此问题的一些建议。

关于c++ - 第二次无法捕获段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69273765/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com