我正在尝试运行一个线程,它将负责检测同一进程中任何其他线程的信号。
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”时,这是有效的,但是当我实际执行某些非法指针操作时(在任何其他线程中),进程核心转储。
为什么子线程产生的信号没有被我的增强信号捕获线程捕获?
答案 0 :(得分:2)
啊 - 我明白了。
问题在于:
sigset_t sigset;
sigfillset(&sigset);
pthread_sigmask( SIG_BLOCK, &sigset, &old );
对pthread_sigmask使用sigfillset很危险,因为阻止同步信号会导致不良影响。
如果有任何SIGFPE,SIGILL,SIGSEGV, 或者生成SIGBUS信号 他们被封锁,结果是 未定义,除非信号是 由kill()函数生成的 sigqueue()函数或raise() 功能