2011-02-07 5 views
0

SIGALRMに問題が発生しましたが、これはトリガーされていないようです。私はコードの簡潔さのためにsigaction()ではなくsignal()を使用しています。Cのalarm()とSIGALRMに関する問題

目的は、読み込むループをいくつか持たせることですが、x秒後に再び読み込む前にすべての変数を再初期化します。私はそれに警報を使います。

volatile sig_atomic_t restartBool; 

void catch_alarm(int sig) 
{ 
    fprintf(stderr, "ALARM CALLED\n"); 
    restartBool = 1; 
} 

int  main(void) 
{ 

    int n, fd_in = 0; 
    char newChar; 

    signal(SIGALRM, catch_alarm); 

    while (1) {      /* main loop */ 

      restartBool = 0; 

      // Set a timer before we start reading 
      alarm(2); 

      while (restartBool == 0 && (n = read(fd_in, &newChar, 1)) == 1) {  /* parse input */ 
       /* ..... */ 
      } 
      fprintf(stderr, "EXITED THE LOOP"); 

      // Cancel the alarm/timer 
      alarm(0); 
    } 
} 

まあcatch_alarm()関数内のfprintf()文が呼び出されることはありません、と私はなぜ(私はLinux上で実行している)ことを確認していないされています。

すべてのヘルプは、

は、それはあなたの読み取りがあなたのタイマーがオフになるずっと前に0(左なしバイト)を返している可能性が最も高いです

Jary

+3

-1(偽コード用)コードはそのままコンパイルされず、 'int n、fd_in = 0、newChar;'を 'main'の先頭に追加すると、うまく動作します(メッセージが出力されます)。 –

+2

'fprintf'はリエントラントではありません。シグナルハンドラからコールするのは安全です。なぜなら、シグナルが渡されたときにコールの途中にいる可能性があるからです。 –

+0

申し訳ありませんR ..、私はコードをより簡潔にしようとしていましたが、私はそれを修正しました。それは私のために印刷されません、いくつかのフォーラムでLinuxのいくつかのバージョンで問題になる可能性があると聞いていますが、それが可能かどうかはわかりません。間違いなく私には何も印刷されていません。 – Jary

答えて

1

、非常にあなたを素晴らしいありがとうございます。 IEを終了すると、ループが終了します。データがなくなり、アラームが解除されています(まだ消えていない状態です)。

関連する問題