我正在编写具有许多独立线程的应用程序。虽然我在那里做相当低级、危险的事情,线程可能会失败(SIGSEGV、SIGBUS、SIGFPE),但它们不应该杀死整个进程。有没有办法以正确的方式做到这一点?
目前,我拦截上述信号并在其信号处理程序中调用 pthread_exit(NULL)。它似乎有效,但由于 pthread_exit 不是异步信号安全函数,我有点担心这个解决方案。
我知道将此应用程序拆分为多个进程可以解决问题,但在这种情况下,这不是一个可行的选择。
编辑:我知道由于忽略 SIGSEGV/SIGBUS/SIGFPE 而可能发生的所有坏事™(我在低级系统和内核编程方面经验丰富),所以请尝试回答我的特定问题给我上有关可靠性的类(class)。
最佳答案
执行此操作的正确方法是让整个进程终止,然后启动另一个进程。您没有解释为什么这不合适,但本质上,这是针对各种令人讨厌的极端情况完全安全的唯一方法(这可能适用也可能不适用于您的情况)。
我不知道有任何方法是 100% 安全的,而不涉及让整个过程。 (另请注意,有时从此类错误中继续执行的行为是“未定义的行为” - 这并不意味着您肯定会摔倒,只是这可能是一个问题)。
当然可能有人知道一些有效的巧妙技巧,但我非常确定唯一 100% 保证的方法是终止整个进程。
关于c - 使进程在其线程中的失败中幸存下来,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17665332/