1

毎秒30秒間タイマーをトリガーしたい。ただし、タイマーは 1 回だけトリガーされ、プログラムは停止します。タイマーを 30 秒間実行するにはどうすればよいですか?

#include <sys/time.h>
#include <signal.h>

void alarmhandler(){
    printf("\nTimer triggered");
}

void main(){
    struct itimerval timerval;
    signal(SIGALRM, alarmhandler);
    timerval.it_value.tv_sec = 1;
    timerval.it_value.tv_usec = 0;
    timerval.it_interval.tv_sec = 30;
    timerval.it_interval.tv_usec = 0;
    setitimer(ITIMER_REAL, &timerval, 0);
    pause();    
}
4

2 に答える 2

0

シグナルを受信した後、プログラムは一時停止を解除され、main() の最後に移動して戻ります。別の信号を待ちたいので、もう一度一時停止する必要があります。

于 2016-01-20T04:49:07.097 に答える
0

あなたが抱えている問題の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, &notimer, 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;
}

最後に注意すべきことは、システム負荷が高い場合、タイマーが毎秒配信されるという保証はないということです。

于 2016-01-20T04:52:12.700 に答える