我正在尝试运行一个线程,它将负责检测来自同一进程内任何其他线程的信号 .
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 回答
啊 - 我懂了
问题出在这里:
对pthread_sigmask使用sigfillset很危险,因为阻塞同步信号会导致不良影响 .