繁体   English   中英

信号处理程序和库工作线程

[英]signal handler and library worker threads

我的应用程序的客户端代码是单线程的,但是我使用的是TCP套接字通信库,该库可能创建从客户端应用程序角度来看应该透明的工作线程。 但是,我有一个捕获SIGSEGV错误的信号处理程序,该错误处理程序试图打印堆栈跟踪,现在间歇性地失败了。

我想知道是否可能在进程内部创建工作线程这一事实是否会影响信号处理程序的执行? 内核可以决定在某些工作线程中执行信号处理程序吗? 如果是这样,是否有某种方法可以避免这种情况的发生并强制信号处理程序始终在主进程线程上执行?

  1. SIGSEGV处理程序存在一个固有的问题,即每个SEGV (不包括人为的示例)都是由未定义的行为(更不用说意外的行为)引起的,程序随后所做的工作也同样未定义。 或者用较少的语言律师用语,您不知道发生了什么。 例如,如果您覆盖了堆,或者在保留malloc()内的某些锁的情况下执行SEGV ,则信号处理程序将无法正常工作。

  2. 在最好的情况下,让线程和信号处理程序协同工作并非易事。 程序在线程化时对信号设置错误的容忍度要差得多(以我的经验)。 首先,请确保您使用的是现代API。 IE不使用signal (2) 适当使用sigactionpthread_sigmask

  3. 请注意,某些信号(包括SIGSEGV )被传递到进程而不是线程。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM