首页 文章

信令线程问题

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

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

1 回答

  • 2

    啊 - 我懂了

    问题出在这里:

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

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

    如果在阻塞时生成任何SIGFPE,SIGILL,SIGSEGV或SIGBUS信号,则结果是未定义的,除非信号由kill()函数,sigqueue()函数或raise()函数生成 .

相关问题