2016-03-30 18 views
3

私は通常、一時停止して信号を取得した後に何かをするデーモンをプログラムしました(私はそれを別のプロセスに起動するためにSIGHUPを使用します)。シグナルの処理中に同じシグナルをブロックする方法は?

ここに私のコードです。

... 
static volatile sig_atomic_t saw_hup = 0; 

static void sighup_handler(int s) 
{ 
    saw_hup = 1; 
} 

int main(void) 
{ 
    struct sigaction act_new; 

    ... 
    sigemptyset(&act_new.sa_mask); 
    act_new.sa_handler = sighup_handler; 
    sigaction(SIGHUP, &act_new, NULL); 

    while(1) { 
     saw_hup = 0; 

     pause(); 
     if(saw_hup) { 
      do_section_A(); 
     } 
    } 
} 

限り、私はそれをテストしてきたように)、信号のためのいくつかのスタックがあるようですので、セクションAの実行時に発生する信号は、(一時停止から起床デーモンを行い、再びセクションAを実行します直前のセクションAを終了した直後。

しかし、次のSIGHUP信号をブロックし、セクションAをもう一度実行しないようにします。私が望むのは、前のSIGHUPシグナルによって実行されたセクションAの途中を除いて、SIGHUPが起こるたびにセクションAを実行することです。それ、どうやったら出来るの?


セクションAの実行途中でセクションAの実行がセクションSの実行直後に再び実行されるという問題があると思います。

は、ここに私の修正コード私が望んでいたように動作するようです

... 
static volatile sig_atomic_t saw_hup = 0; 

static void sighup_handler(int s) 
{ 
    saw_hup = 1; 
} 

int main(void) 
{ 
    struct sigaction act_new; 

    ... 
    sigemptyset(&act_new.sa_mask); 
    act_new.sa_handler = sighup_handler; 
    sigaction(SIGHUP, &act_new, NULL); 

    while(1) { 
     saw_hup = 0; 

     pause(); 
     if(saw_hup) { 
      do_section_A(); 
     } 
    } 
} 

です。誰もこのコードに何か問題があると思いますか?

+1

セクションAをシグナルハンドラに移動しないのはなぜですか? – user3528438

+0

セクションAをシグナルハンドラに移動しようとしました。ハンドラ実行中に新しいSIGHUP信号が発生した場合は、直前のシグナルのハンドラ関数を終了した後で再びシグナルハンドラを実行します。私が望むのは、次の信号がpause()を起こさないようにすることです。 –

+1

http://stackoverflow.com/questions/5285414/signal-queuing-in-c – user3528438

答えて

1

pthread_sigmask()はスレッド内の信号をマスクするために使用できます。 sigprocmask()は、シングルスレッドアプリケーションでシグナルをマスクするために使用できます。

+0

私の質問に答えてくれてありがとう、gzh。私はpause()の直後とセクションAの最後にsigprocmask()を使用しようとしました。しかし、セクションAを終了した後、セクションAは前のシグナルの実行中に発生したシグナルによって再度実行されます。だから、私が望むのは、次の信号がpause()を起こさないようにすることです。 –

+0

@ SB.Sonでは、シグナルをブロックする方法だけでなく、処理の流れを再考する必要があります。ピルクロウが提供する回答を参照してください。 – gzh

関連する問題