0

トリガーされていないように見える SIGALRM に問題があります。コードを簡単にするために、sigaction() ではなく signal() を使用しています。

目的は、読み取りを行うループを作成することですが、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 で実行しています)。

どんな助けでも素晴らしいでしょう、

どうもありがとうございました、

ジャリー

4

1 に答える 1

1

タイマーが切れるずっと前に、読み取りが 0 (バイトが残っていない) を返している可能性が最も高いです。IE、データがなくなったためにループが終了し、アラームをキャンセルしています(まだ鳴っていません)。

于 2011-02-08T03:09:10.573 に答える