0

複数のタイマーを同時に開始し、タイマーが停止したか、まだ進行中かを具体的に知る必要があります。

#define RESEND_TIMEOUT  5

void timer_set_timeout(timer_t * timer, uint32_t timeout);
void timer_start(timer_t * timer);
bool timer_complete(timer_t * timer);
void signal_handler(int sig, siginfo_t *si, void *uc);

int main() {
    timer_t resend_timer;
    printf("starting timer\n");
    timer_start(&resend_timer);
    timer_set_timeout(RESEND_TIMEOUT);
    while(1) {

    if (timer_complete(&resend_timer))
        break;
    }
}

void timer_set_timeout(timer_t * timer, uint32_t timeout)
{
    struct itimerspec it_val;
    it_val.it_value.tv_sec = timeout;
    it_val.it_value.tv_nsec = 0;
    it_val.it_interval.tv_sec = 0;
    it_val.it_interval.tv_nsec = 0;
     if (timer_settime(*timer, 0, &it_val, NULL) == -1) {
         errExit("Could not set timeout");
     }
}

void timer_start(timer_t * timer)
{
    struct sigaction sa;
    struct sigevent sev;

    // establish signal handler
    sa.sa_flags = SA_SIGINFO;
    sa.sa_sigaction = signal_handler;
    sigemptyset(&sa.sa_mask);
    if (sigaction(SIG, &sa, NULL) == -1)
       errExit("Failed to establish signal handler");

    // create timer
    sev.sigev_notify = SIGEV_SIGNAL;
    sev.sigev_signo = SIG;
    sev.sigev_value.sival_ptr = timer;

    if(timer_create(CLOCK_MONOTONIC, &sev, timer) == -1) {
        errExit("Could not start timer");
    }
}

// return true if timer ended
bool timer_complete(timer_t * timer)
{
    if(timer_getoverrun(*timer) == 0)
        return false;
    else
        return true;
}

void signal_handler(int sig, siginfo_t *si, void *uc)
{
    printf("Timer ran out!\n");
    signal(sig, SIG_IGN);
}

シグナル ハンドラーは 5 秒後に実行されますが、タイマーが終了したのか、timer_complete を使用していないのかを知ることができません。int timer_gettime(timer_t timerid, struct itimerspec *curr_value) を試しましたが、curr_value に何を渡せばよいかわかりません。itimerspec を宣言しようとしましたが、getoverrun と同じ結果になります。

timer_settime のフラグ TIMER_ABSTIME も試しましたが、何らかの理由でタイマーがすぐに期限切れになります。

4

1 に答える 1