2

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

我不希望我的申请退出SIGSEGV;我只想终止产生信号的线程,并在其他线程中继续整个应用程序的流程。是否可以?

4

1 回答 1

5

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

正如 asveikau 所提到longjmp的,您可以退出信号处理程序并尝试清理,但如果崩溃发生在、、 或任何修改全局数据或与之共享的数据的状态的函数的中间malloc,这可能会使情况变得更糟其他线程或将在目标的清理代码中访问的线程。状态可能损坏/不一致,和/或锁可能被持有并永久不可释放。freeprintflongjmp

如果你能确保这不会发生——例如,如果行为不端的线程从不调用任何异步信号不安全函数——那么longjmp退出信号处理程序然后调用pthread_exit.

另一种方法可能是永久冻结信号处理程序中的线程,方法是将所有信号添加到sa_maskforSIGSEGV然后写入for (;;) pause();信号处理程序。这是 100%“安全”的,但如果崩溃线程持有任何锁,则可能会使进程处于死锁状态。这可能比将损坏状态暴露给其他线程并进一步破坏您的数据到地狱“更糟糕”......

于 2011-09-03T05:18:41.540 回答