开发者

A signalling thread problem

I am attempting to get a thread running which will be responsible for detecting a signal from any other thread within the same process.

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

Once i've done this, I then daemonize the process:

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

This is done within another class called "SignalHandler" where the kick-off to this thread is done as follows:

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

and the functor operate开发者_如何转开发s in a tight loop as follows:

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;
    }
}

This works when I do a "kill -9 myProcess", but when I actually perform some illegal pointer manipulation (in any other thread), the process core dumps.

Why is the signal produced by the child thread not caught in my boost signal-catching thread?


Ah - I got it.

The problem is here:

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

Using sigfillset for pthread_sigmask is dangerous because blocking the synchronous signals causes undesirable effects.

If any of the SIGFPE, SIGILL, SIGSEGV, or SIGBUS signals are generated while they are blocked, the result is undefined, unless the signal was generated by the kill() function, the sigqueue() function, or the raise() function.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜