我正在使用ncurses,每当我遇到段错误时,ncurses都没有正确释放对终端的控制权(因为从未调用过endwin())。我设置了一个信号处理程序:
void handler(int signum) {
endwin();
exit(EXIT_FAILURE);
}
但问题是segfault被忽略,而不是延迟到endwin()之后。我是C ++的新手;可以像异常那样捕获段错误,这样我就可以拥有一个finally块吗?或者是否有人从处理程序内部重新发送段错误?
答案 0 :(得分:4)
Segfault是未定义的行为。你必须找到并修复它。不要担心ncurses不发布终端,找到并修复bug。
答案 1 :(得分:0)
来自signal手册页:
根据POSIX,在忽略SIGFPE,SIGILL之后,进程的行为是未定义的, 或者不是由kill(2)或raise(3)生成的SIGSEGV信号。
在seg故障之后尝试做任何事情都是疯狂的。这就像你在碰撞后激活的安全气囊,你继续驾驶,因为,你有一个安全气囊,它会让你在碰撞中保持安全。用处理程序来解决这个问题并非如此。
一种方法是让程序从文件中获取输入或输出输出。您也可以尝试remotely attaching to a process with gdb。从来没有这样做但是值得一试。