2012-04-12 10 views
0

Ich soll einen Signal-Handler implementieren, der alle Threads im Programm beim ersten Aufruf eines bestimmten Signals stoppt und sie wieder aufnimmt, wenn sie bereits gestoppt sind. I umgesetzt einen Dämon-Thread im Hintergrund ausgeführt werden mit dem folgenden Code:sigtimedwait und Erkennung von Signalen

void *handle_sig(void *arg) 
{ 
    sigset_t set; 
    //set set... 

    struct timespec to; 
    to.tv_sec = 1; 
    to.tv_nsec = 0; 

    while (_keepListening) { 

     int ret = sigtimedwait(&set, NULL, &to); 

     if (ret < 0) 
      if (errno == EAGAIN) { 
       continue; /* no signal sent*/ 
      } else { 
       fprintf(stderr, "Failed...\n"); 
       exit(1); 
      } 

     if (_state == PAUSE_STATE) { /* was blocked*/ 
      //do something 
     } else { 
`      //do something else 
     } 

    } 
    return NULL; 
} 

Das Problem ist, dass, wenn ein Signal gesendet wird, und erfaßt wird, und dann wird eine andere gesendet, bevor die while-Schleife wieder eingegeben wird - das zweite Signal ignoriert, wodurch das Programm für immer stehen bleiben kann. Gibt es eine Möglichkeit festzustellen, ob seit dem letzten Aufruf von sigtimedwait ein Signal gesendet wurde?

Vielen Dank

+0

Signale sind eine Art boolesche Funktion. Entweder ein Signal ist aktiv oder nicht, es gibt keinen Zähler oder eine Warteschlange, wenn das gleiche Signal zweimal vor der ersten auftritt. –

Antwort

0

Sie könnten darüber nachdenken, Ihre Verarbeitung asynchron zu machen.

Zum Beispiel durch Starten eines Threads für "etwas tun" oder "etwas anderes tun".