c - 使进程在其线程中的失败中幸存下来

标签 c linux unix posix

我正在编写具有许多独立线程的应用程序。虽然我在那里做相当低级、危险的事情,线程可能会失败(SIGSEGV、SIGBUS、SIGFPE),但它们不应该杀死整个进程。有没有办法以正确的方式做到这一点?

目前,我拦截上述信号并在其信号处理程序中调用 pthread_exit(NULL)。它似乎有效,但由于 pthread_exit 不是异步信号安全函数,我有点担心这个解决方案。

我知道将此应用程序拆分为多个进程可以解决问题,但在这种情况下,这不是一个可行的选择。

编辑:我知道由于忽略 SIGSEGV/SIGBUS/SIGFPE 而可能发生的所有坏事™(我在低级系统和内核编程方面经验丰富),所以请尝试回答我的特定问题给我上有关可靠性的类(class)。

最佳答案

执行此操作的正确方法是让整个进程终止,然后启动另一个进程。您没有解释为什么这不合适,但本质上,这是针对各种令人讨厌的极端情况完全安全的唯一方法(这可能适用也可能不适用于您的情况)。

我不知道有任何方法是 100% 安全的,而不涉及让整个过程。 (另请注意,有时从此类错误中继续执行的行为是“未定义的行为” - 这并不意味着您肯定会摔倒,只是这可能是一个问题)。

当然可能有人知道一些有效的巧妙技巧,但我非常确定唯一 100% 保证的方法是终止整个进程。

关于c - 使进程在其线程中的失败中幸存下来,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17665332/

相关文章:

c - Nicelabel 算法超过 MAX TICKS

C 填充二维数组

linux - 帮助调试具有正确脚本路径并在手动触发时工作的 cron 作业

macos - 在 OS X Yosemite 上设置 Apache 2.4.9 时遇到问题

c 到 mips 源和目标指针

c - 如何在 C 中打印带有计数的字符串中的重复字母?

c - Linux 用户空间 DMA 访问(用于内存-内存复制)

linux - 设置文件所有者 :group in Linux using Qt/C++

unix - tmux set -g 鼠标选择窗口不起作用

php - "./file"和 "file"相对路径有什么区别