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