我需要在我的 Linux 应用程序中处理 SIGSEGV。原因是在生成核心转储之前必须完成一些清理工作(3 方库)。更重要的是,清理必须在调用线程的上下文中执行,不能在信号处理程序中执行。 所以我计划在信号处理程序中将控制权传递给调用线程,在清理完成后,然后使用 raise(SIGSEGV) 生成核心转储。
真正的问题似乎是 signal_handler 无法将控制传递给调用线程,无论我使用 post_sem 还是其他一些。 有什么办法处理这个案子吗?是否可以劫持 SIGSEGV,然后在 SIGSEGV 处理程序中返回到另一个线程以执行一些清理工作?
信号(SIGSEGV, signal_handler);
信号处理程序() { ... post_sem(); ...
调用线程() { wait_sem(); 清理(); ...
最佳答案
您想在 SIGSEGV(即严重错误)之后进行清理...我觉得这有点奇怪,因为,1) 如果您正在调试应用程序,您应该将所有内容完好无损地存储在核心文件中,这样您就可以准确地确定发生了什么,以及 2) 如果您有针对客户的发布申请(比方说)那么……它不应该是 SIGSEGV :)(反正不是我的问题,只是说..)
正题,
我认为您可以尝试在所有线程中阻止 SIGSEGV,但您尝试进行清理的线程除外;这应该使操作系统将信号传递给该特定线程。我能想到的其他解决方案类似于 setjmp()/longjmp() (虽然还没有测试过这些)。
请注意,一旦您的程序获得了 SEGV,您就处于不稳定的状态(即您的清理也可能会失败并生成另一个 SEGV 等),因此您应该考虑使用核心崩溃。
关于linux - 在 Linux 中处理 SIGSEGV?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3012237/