Проблема сигнального потока - PullRequest
0 голосов
/ 09 марта 2010

Я пытаюсь запустить поток, который будет отвечать за обнаружение сигнала от любого другого потока в том же процессе.

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 голосов
/ 10 марта 2010

Ах, я понял.

Проблема здесь:

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

Использование sigfillset для pthread_sigmask опасно, поскольку блокировка синхронных сигналов вызывает нежелательные эффекты.

Если любой из SIGFPE, SIGILL, SIGSEGV, или сигналы SIGBUS генерируются во время они заблокированы, результат не определено, если сигнал не был генерируется функцией kill (), функция sigqueue (), или повышение () функция.

...