2010-03-09 4 views
0

Je tente d'exécuter un thread qui sera chargé de détecter un signal provenant de n'importe quel autre thread dans le même processus.Un problème de threads de signalisation

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

Une fois que je l'ai fait, je daemonize alors le processus:

m_child = fork(); 
if (m_child == 0) 
{ 
    // Start the thread responsible for detecting a signal 
} 

Cela se fait dans une autre classe appelée « SignalHandler » où le coup d'envoi à ce fil se fait comme suit:

m_pThread = new boost::thread(boost::bind(&SignalHandler::operator(), this)); 

et le foncteur fonctionne dans une boucle serrée comme suit:

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; 
    } 
} 

Cela fonctionne quand je fais un "kill -9 myProcess", mais quand je réalise réellement une manipulation de pointeur illégale (dans n'importe quel autre thread), les décharges de noyau de processus.

Pourquoi le signal produit par le fil de l'enfant n'est-il pas pris dans mon fil d'accrochage du signal de survoltage?

Répondre

2

Ah - Je l'ai compris.

Le problème est ici:

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

L'utilisation sigfillset pour pthread_sigmask est dangereux parce que le blocage des signaux synchrones provoque des effets indésirables.

Si l'un des SIGFPE, SIGILL, SIGSEGV, ou des signaux SIGBUS sont générés tout en ils sont bloqués, le résultat est indéfini, à moins que le signal a été généré par la fonction kill(), le sigqueue() fonction, ou la fonction raise() .

Questions connexes