我正在尝试让一个线程运行,该线程将负责检测来自同一进程中任何其他线程的信号。
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”时有效,但当我实际执行一些非法指针操作时(在任何其他线程中),进程核心转储。
为什么子线程产生的信号没有被我的boost信号捕捉线程捕捉到?
啊 - 我明白了。
问题出在这里:
sigset_t sigset;
sigfillset(&sigset);
pthread_sigmask( SIG_BLOCK, &sigset, &old );
对 pthread_sigmask 使用 sigfillset 是危险的,因为阻塞同步信号会导致不良影响。
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.
我是一名优秀的程序员,十分优秀!