複数のタイマーを同時に開始し、タイマーが停止したか、まだ進行中かを具体的に知る必要があります。
#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 も試しましたが、何らかの理由でタイマーがすぐに期限切れになります。