我有一个启动多个线程的应用程序。 我正在使用信号处理程序捕获信号。
我不希望我的应用程序退出SIGSEGV
;我想只终止产生信号的线程,并继续在其他线程中完整应用程序的流程。
有可能吗?
答案 0 :(得分:5)
如果发生SIGSEGV
,则表明您的程序已经调用了未定义的行为,即整个程序的状态未定义/不确定/无效。在实践中,你可能能够恢复并继续跑步,但是不能保证,这可能很危险。
正如asveikau所提到的那样,你可以从信号处理程序中longjmp
并尝试清理,但如果崩溃发生在malloc
,{{1}的中间,这可能会造成更糟的混乱},free
,或修改与其他线程共享的全局数据或数据的状态的任何函数,或者将在printf
目标的清理代码中访问的函数。国家可能是腐败/不一致,和/或锁定可能被保留并永久不可释放。
如果你能确保不会发生这种情况 - 例如,如果行为异常的线程从不调用任何异步信号不安全的函数 - 那么longjmp
可以安全地从信号处理程序中调用{{1} }}
另一种方法是永久冻结信号处理程序中的线程,方法是将所有信号添加到longjmp
pthread_exit
,然后在信号处理程序中写sa_mask
。这是100%“安全”,但如果崩溃线程持有任何锁,则可能使进程处于死锁状态。这可能比将腐败状态暴露给其他线程并进一步破坏你的数据还要“糟糕”......