是否可以在接收SIGSEGV时仅终止一个线程?

时间:2011-09-03 05:05:50

标签: c signal-handling

我有一个启动多个线程的应用程序。 我正在使用信号处理程序捕获信号。

我不希望我的应用程序退出SIGSEGV;我想只终止产生信号的线程,并继续在其他线程中完整应用程序的流程。 有可能吗?

1 个答案:

答案 0 :(得分:5)

如果发生SIGSEGV,则表明您的程序已经调用了未定义的行为,即整个程序的状态未定义/不确定/无效。在实践中,你可能能够恢复并继续跑步,但是不能保证,这可能很危险。

正如asveikau所提到的那样,你可以从信号处理程序中longjmp并尝试清理,但如果崩溃发生在malloc,{{1}的中间,这可能会造成更糟的混乱},free,或修改与其他线程共享的全局数据或数据的状态的任何函数,或者将在printf目标的清理代码中访问的函数。国家可能是腐败/不一致,和/或锁定可能被保留并永久不可释放。

如果你能确保不会发生这种情况 - 例如,如果行为异常的线程从不调用任何异步信号不安全的函数 - 那么longjmp可以安全地从信号处理程序中调用{{1} }}

另一种方法是永久冻结信号处理程序中的线程,方法是将所有信号添加到longjmp pthread_exit,然后在信号处理程序中写sa_mask。这是100%“安全”,但如果崩溃线程持有任何锁,则可能使进程处于死锁状态。这可能比将腐败状态暴露给其他线程并进一步破坏你的数据还要“糟糕”......

相关问题