linux - 在 Linux 中处理 SIGSEGV?

标签 linux handler signals segmentation-fault

我需要在我的 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/

相关文章:

linux - 如何在 SED 或 AWK 中使用 if, else?

android - 如何在进入新 Activity 之前终止线程和处理程序

jquery - 使用 jquery 和 handler(ashx) 上传文件

c - sigpipe c 服务器/客户端 - 程序在哪里重新启动?

python - 无法找到 whois 库

c - Windows 上的/proc/net/dev 替代方案

java - 如何在使用 jar 命令创建 war 文件时排除某些文件?

java - 为什么这个 postDelayed 不会永远运行?

c - 一个未收割的 child 和它的 future

python - python 和 c 信号处理程序如何协同工作?