あなたが抱えている問題の1つは、最初のタイマートリガーがpause
呼び出しを終了し、プログラムが終了することです。pause
コマンドは次のように記述します。
一時停止関数は、ハンドラー関数を実行するか、プロセスを終了するアクションのシグナルが到着するまで、プログラムの実行を一時停止します。
もう 1 つの問題は、「間隔」の使い方が間違っていることです。その値は、繰り返しタイマーの場合にタイマーがリセットされる数値であると想定されています。したがって、毎秒トリガーするには、に設定する必要があります1
。
ここで、30 秒間実行する場合は、カウンターを維持し、そのカウンターが終了したらタイマーをリセットする必要があります。最後に、十分な割り込みが処理されるまで、再一時停止を続ける必要があります。
これを試して:
#include <sys/time.h>
#include <signal.h>
#include <stdio.h>
#include <unistd.h>
volatile int timer_remain = 30;
void alarmhandler()
{
static struct itimerval notimer = { 0 };
printf( "Timer triggered\n" );
if( --timer_remain == 0 )
{
setitimer( ITIMER_REAL, ¬imer, 0 );
}
}
int main()
{
struct itimerval timerval = { 0 };
timerval.it_value.tv_sec = 1;
timerval.it_interval.tv_sec = 1;
signal( SIGALRM, alarmhandler );
setitimer( ITIMER_REAL, &timerval, 0 );
while( timer_remain > 0 )
{
pause();
}
printf( "Done\n" );
return 0;
}
最後に注意すべきことは、システム負荷が高い場合、タイマーが毎秒配信されるという保証はないということです。