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