2012-04-12 12 views
0

シグナルハンドラを実装すると、最初に特定のシグナルが呼び出されたときにプログラム内のすべてのスレッドが停止し、すでに停止している場合は再開されます。私は、次のコードを使用してバックグラウンドで実行デーモンスレッドを実装:sigtimedwaitとシグナルの検出

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

問題は、IF信号が送信され、検出され、whileループが再び入力される前に、別の送信されるということである - 第二の信号であります無視され、プログラムを永久に一時停止させることができます。 sigtimedwaitへの最後の呼び出しからシグナルが送られたかどうかを検出する方法はありますか?

ありがとうございました

+0

信号は一種のブール値です。信号がアクティブであるかそうでないかは、最初の信号が処理される前に同じ信号が2回発生した場合は、カウンタもキューもありません。 –

答えて

0

あなたの処理を非同期にすることについて考えるかもしれません。

たとえば、「何かを実行する」または「何か他のことを行う」ためのスレッドを開始します。

関連する問題