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
-1(偽コード用)コードはそのままコンパイルされず、 'int n、fd_in = 0、newChar;'を 'main'の先頭に追加すると、うまく動作します(メッセージが出力されます)。 –
'fprintf'はリエントラントではありません。シグナルハンドラからコールするのは安全です。なぜなら、シグナルが渡されたときにコールの途中にいる可能性があるからです。 –
申し訳ありませんR ..、私はコードをより簡潔にしようとしていましたが、私はそれを修正しました。それは私のために印刷されません、いくつかのフォーラムでLinuxのいくつかのバージョンで問題になる可能性があると聞いていますが、それが可能かどうかはわかりません。間違いなく私には何も印刷されていません。 – Jary