2010-03-09 65 views
0

我正试图让一个线程运行,它将负责检测来自同一进程内的任何其他线程的信号。信号线程问题

sigset_t sigset; 
sigfillset(&sigset); 
pthread_sigmask(SIG_BLOCK, &sigset, &old); 

一旦我做到了这一点,我则进程的常驻:

m_child = fork(); 
if (m_child == 0) 
{ 
    // Start the thread responsible for detecting a signal 
} 

这就是所谓的“SignalHandler”其他类,其中开球此主题如下完成内完成:

m_pThread = new boost::thread(boost::bind(&SignalHandler::operator(), this)); 

和算符在紧凑循环中的操作如下:

while (1) 
{ 
    if (sigtimedwait(&sigset, &info, &ts) == -1) 
    { 
     if (errno == EAGAIN || errno == EINTR) 
     { 
      std::cout << "Time-out waiting for signal" << std::endl; 
     } 

     throw SystemError("sigtimedwait error"); 
    } 
    else 
    { 
     std::cout << "Detected a signal [" << info.si_signo << "]" << std::endl; 
    } 
} 

当我执行“kill -9 myProcess”时有效,但是当我实际执行一些非法指针操作(在任何其他线程中)时,进程核心转储。

为什么子线程产生的信号没有捕获到我的升压信号捕获线程?

回答

2

啊 - 我明白了。

问题是这里:

sigset_t sigset; 
sigfillset(&sigset); 
pthread_sigmask(SIG_BLOCK, &sigset, &old); 

为pthread_sigmask使用sigfillset是危险的,因为阻塞的同步信号会导致不希望的效果。

如果任何SIGFPE的,SIGILL,SIGSEGV,被同时 它们被阻塞产生 或SIGBUS信号,其结果是 未定义,除非是由杀灭()函数产生的信号 ,所述 sigqueue ()函数,或raise()函数。