0

我正在使用 ncurses,每当我遇到段错误时,ncurses 都不会正确释放对终端的控制(因为从未调用过 endwin())。我设置了一个信号处理程序:

void handler(int signum) {
    endwin();
    exit(EXIT_FAILURE);
}

但这样做的问题是段错误被忽略,而不是延迟到 endwin() 之后。我对 C++ 很陌生;可以像异常一样捕获段错误,以便我可以有一个 finally 块?或者有没有办法从处理程序内部重新发送段错误?

4

2 回答 2

4

Segfault 是未定义的行为。你必须找到它并修复它。不用担心 ncurses 不释放终端,找到并修复 bug。

于 2010-11-13T01:01:37.380 回答
0

信号 手册页:

根据 POSIX,进程在忽略不是由 kill(2) 或 raise(3) 生成的 SIGFPE、SIGILL 或 SIGSEGV 信号后,其行为是不确定的。

在段错误之后尝试做任何事情是疯狂的。这就像你在碰撞后激活的安全气囊,你继续驾驶,因为,嗯,你有一个安全气囊,它可以让你在碰撞中保持安全。用处理程序对此进行处理不是办法。

一种方法是让您的程序从文件中获取输入或存根输出。您还可以尝试使用 gdb 远程附加到进程。从未做过,但可能值得一试。

于 2010-11-13T01:45:24.040 回答