2017-11-01 25 views
0

私は2つのforループと最初のforループ(1〜5の出力とその間の1秒のスリープ)の間にSIGINTとSIGQUITをブロックするプログラムを作成しています。ループのみがブロックされます。私は正常に最初のループのための正しい信号をブロックし、次に2番目のループで、私はSIGQUITをブロックしようとしますが、両方の信号はまだブロックされているようです。ここでSIGINTとSIGQUITのブロックとブロック解除

は、私は今のよう持っているものです。

#include <unistd.h> 
#include <stdio.h> 
#include <wait.h> 
#include <signal.h> 
#include <string.h> 


void hd1(int sig){ 
    if(sig == SIGINT){ 
     printf(" SIGINT Recieved\n"); 
    }else if(sig == SIGQUIT){ 
     printf(" SIGQUIT Recieved\n"); 
    } 
} 


int main(){ 
    sigset_t new_set; 
    sigset_t old_set; 

    //struct sigaction act; 
    //memset(&act, 0, sizeof(act)); 

    //act.sa_handler = hd1; 

    //sigaction(SIGINT, &act, 0); 
    //sigaction(SIGQUIT, &act, 0); 

    sigemptyset(&new_set); 
    sigaddset(&new_set, SIGINT); 
    sigaddset(&new_set, SIGQUIT); 

    sigprocmask(SIG_BLOCK, &new_set, &old_set); 

    for(int i = 1; i <= 5; i++){ 
     printf("%d\n", i); 
     sleep(1); 
    } 


    sigdelset(&new_set, SIGQUIT); 


    for(int i = 1; i <= 5; i++){ 
     printf("%d\n", i); 
     sleep(1); 
    } 
} 

私はマスクをリセットするためにブロックを解除してsetmaskするsigprocmaskを使用して試してみましたが、私は信号のブロックを解除するときには、ループの後、プログラムを終了します。

+0

あなたは 'sigemptyset(....)をしようと持っている。siggaddset(...、SIGINT);は、sigprocmask(SIG_UNBLOCK、...);'? –

答えて

2

sigprocmask();をもう一度使用してください。そして、ブロックされた信号のセットは、引数セットに設定されているSIG_SETMASK SIG_SETMASK

を使用しています。

sigdelset(&new_set, SIGQUIT); 
sigprocmask(SIG_SETMASK, &new_set, NULL); 
+0

from man:SIG_BLOCK:ブロックされたシグナルのセットは、現在のセットとset引数の和集合です。 –

+0

@IngoLeonhardt私の悪い、ありがとう。 – Stargateur

+0

私はsigprocmask(SIG_SETMASK、...)とSIG_UNBLOCKとSIG_BLOCKを使ってみましたが、同じ結果が得られました – zsloan112

関連する問題