2016-05-29 10 views
-1

私は、C for Linuxで信号処理を示す簡単なプログラムを持っています。私は実験のためにそれを複雑...Linux:シグナルハンドラ内のシグナルを無視し、そのような連続するシグナルをすべて無視する

void sigquit(int signo) 
{ 
    printf("Recieved signo : %d\n",signo); 
    signal(SIGQUIT,SIG_IGN); 
} 

int main() 
{ 

    /* register the signal handler */ 
    if(signal(SIGQUIT,sigquit) == SIG_ERR) 
    { 
     perror("Error handling SIGQUIT signal"); 
     exit(1); 
    } 
    for(;;); 
    return 0; 
} 

私は、出力取得しています:私は期待していたのに対し、

^\Recieved signo : 3 
^\^\^\^\^\^\^\ 

をこの:

^\Recieved signo : 3 
    ^\Recieved signo : 3 
    ^\Recieved signo : 3 
    ^\Recieved signo : 3 

なぜ私のハンドラが呼び出された初回のみとそれ以上はない。私は信号がメインスレッドに来てからハンドラに渡されることを期待していました。シグナル(SIGQUIT、SIG_IGN);

+0

だから、この行の背後にある 'signal(SIGQUIT、SIG_IGN);という考えはどうですか? ;-) – alk

答えて

3

シグナル(SIGQUIT、SIG_IGN);

シグナルハンドラからは、シグナルが発生した以降のすべてのケースを無視するようにプログラムに指示しました。その結果、あなたが信号をもう一度送ると、あなたがそれを伝えたように、それは無視されます。

+0

混乱はおそらく私の理解のためです。これまでは、プログラムが 'main()'で始まるので、 'sigint()'をハンドラとして登録したいと考えています。したがって、シグナルが来るたびに呼び出される 'sigint'を登録する(コンパイラか実行時のどちらかがわからない)。 'sigint()'の中にあるものは無関係です。これはhttp://unix.stackexchange.com/questions/80044/how-signals-work-internallyに役立つかもしれません。私は、作業を明確にするためにそれをもっと探求しています。 –

+0

"* sigint()の中身は無関係です。*"なぜですか? :-S @InsaneCoder 'int i = 0;を入れてみてください。 i/= i; 'ハンドラの内部。 :-) – alk

+0

@InsaneCoderコンパイラのように聞こえるようにしてください。そうではありません。あなたのプログラムは、一度に1つのコマンドを実行します。シグナルハンドラが登録され、別の命令が与えられるまで、シグナルが受信されるとハンドラが呼び出され、一度に1つのコマンドが実行されます。あなたはハンドラの中にコードを置いてそれを止め、実際にはシステムは停止しました。 –

関連する問題