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

时间:2014-03-07 17:51:24

标签: c++ linux multithreading signals

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

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

1 个答案:

答案 0 :(得分:0)

  1. SIGSEGV处理程序有一个固有的问题,因为每个SEGV(除了设计的例子)都来自未定义的行为(更不用说意外的行为),之后程序的作用是同样未定义。或者用较少的语言法来说,你不知道什么是破碎的。例如,如果您覆盖了堆,或者SEGV,而malloc()内的某些锁被保留,那么您的信号处理程序将无法正常工作。

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

  3. 请注意,某些信号(包括SIGSEGV)会传递给流程,而不会传递给线程。