信令线程问题

时间:2010-03-09 14:40:41

标签: linux multithreading boost signals

我正在尝试运行一个线程,它将负责检测同一进程中任何其他线程的信号。

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”时,这是有效的,但是当我实际执行某些非法指针操作时(在任何其他线程中),进程核心转储。

为什么子线程产生的信号没有被我的增强信号捕获线程捕获?

1 个答案:

答案 0 :(得分:2)

啊 - 我明白了。

问题在于:

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

对pthread_sigmask使用sigfillset很危险,因为阻止同步信号会导致不良影响。

  

如果有任何SIGFPE,SIGILL,SIGSEGV,   或者生成SIGBUS信号   他们被封锁,结果是   未定义,除非信号是   由kill()函数生成的   sigqueue()函数或raise()   功能