2010-03-09 4 views
0

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

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», но когда я фактически выполняю некоторые незаконные манипуляции с указателями (в любом другом потоке), дампы ядра процесса.

Почему сигнал, создаваемый дочерней нитью, не попал в мою сигнальную нить?

ответ

2

А - Я понял.

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

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

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

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

Смежные вопросы