2017-05-31 4 views
-1

ここでは、この問題の簡単なレクリエーションだcatchedされています。何が起こるかは、端末からCTR + Cを一度しか読み取ることができないことです。 2番目のポイント以降は、単にコンソールに^ Cを書き込むだけです。私はハンドラを毎回リセットする必要がありますか?前もって感謝します。SIGINTの葛は一度だけ

+1

'signal 'の動作は、あなたが持っているUnixの亜種によって異なります。一貫した動作を得るには、代わりに['sigaction'](http://pubs.opengroup.org/onlinepubs/9699919799/functions/sigaction.html)を使用してください。 –

+0

一般的なシグナルハンドリングのための優れたドキュメントと、特に 'man'コマンドを介してオンラインで利用できる' signal() '関数があります。 –

+1

また、 'printf'はシグナルハンドラを呼び出すための安全な関数ではないと考えられます。 –

答えて

0

signalは高度に定義されており、そのためにsigactionを使用する必要があります。あなたが見ているのは、いわゆるsysvセマンティクスがsignalです。シグナルはハンドラ内でSIG_DFLにリセットされ、再実行がブロックされません。

は、おそらくのようなものとします。これは、信号をリセットしないであろうと、それはそれをブロックしません

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

#define WRITE_LIT(fd, lit) write(fd, lit, sizeof lit - 1) 

void handler(int sig){ 
     if(sig == SIGINT){ 
      WRITE_LIT(2, "Signal caught\n"); 
      execl("./recreate","./recreate", (char*)NULL); 
      WRITE_LIT(2, "Couldn't run ./recreate\n"); 
      _exit(127); 
     } 
} 

int main(){ 
    printf("Main start\n"); 
    sigaction(SIGINT, &(struct sigaction const){ 
     .sa_handler = handler, 
     .sa_flags = SA_NODEFER /*don't block signals for the new process image*/ 
    }, 
    0); 
    while(1); 
     return 0; 
} 

をいずれか(デフォルトはハンドラの継続のためにそれをブロックすることがある)ので、新しいプロセス画像がブロックされたくない可能性があります。