首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否可以在接收到SIGSEGV时仅终止一个线程?

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

Stack Overflow用户
提问于 2011-09-03 13:05:50
回答 1查看 888关注 0票数 2

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

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-09-03 13:18:42

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

正如asveikau提到的,你可以longjmp出信号处理程序并尝试清理,但如果崩溃发生在mallocfreeprintf或任何修改全局数据或与其他线程共享的或将在longjmp目标的清理代码中访问的数据的状态的函数中,这可能会造成更糟糕的混乱。状态可能是损坏的/不一致的,和/或锁定可能被持有并永久不可释放。

如果您可以确保这种情况不会发生-例如,如果行为异常的线程从不调用任何异步信号不安全函数-那么从信号处理程序中longjmp出来,然后调用pthread_exit可能是安全的。

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

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7291273

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档