如何知道计时器是否已在C中结束

时间:2013-11-06 04:22:19

标签: c linux timer signals

我需要能够同时启动多个计时器并具体了解计时器是否已停止或仍在继续。

#define RESEND_TIMEOUT  5

void timerCreate();
void timer_start(timer_t * timer, uint32 timeout);
bool timer_complete(timer_t * timer);

int main() {
    timer_t resend_timer = timerCreate();

    timer_start(&resend_timer, RESEND_TIMEOUT);
    while(1) {

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

void timer_start(timer_t * timer, uint32_t timeout)
{
    printf("timer starting\n");
    struct itimerspec it_val;
    it_val.it_value.tv_sec = timeout;
    it_val.it_value.tv_nsec = 0;

    // timer expires once
    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");
    }
}

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

我从不打破循环。为什么我不能得到定时器的超限(它总是返回0,这意味着定时器没有超过它的到期时间)?然而,当我添加信号处理程序时,我知道计时器到期。

我想在timer_complete函数中尝试timer_gettime(timer_t timerid,struct itimerspec * curr_value)以查看剩余时间是否为0,但是如何在没有全局变量的情况下传递curr_value参数?

最后但并非最不重要的是,在使用timer_settime布防定时器时,我尝试使用TIMER_ABSTIME标志。从int timer_settime的手册页(timer_t timerid,int flags,                          const struct itimerspec * new_value,                          struct itimerspec * old_value):

  

默认情况下,指定的初始到期时间          new_value-> it_value是相对于当前时间的解释          通话时的计时器时钟。这可以修改          在flags中指定TIMER_ABSTIME,在这种情况下new_value-> it_value          被解释为在计时器时钟上测量的绝对值;          也就是说,当时钟值达到该值时,定时器将到期          由new_value-> it_value指定。如果指定的绝对时间有          已经通过,然后计时器立即到期,并且超限          count(请参阅timer_getoverrun(2))将正确设置。

1 个答案:

答案 0 :(得分:2)

  

我从不打破循环。为什么我不能得到定时器的溢出(它总是返回0,这意味着定时器没有通过它的到期)?

不,这意味着你没有超支。

即使您指定实时信号,操作系统也不会对计时器信号进行排队。 Overun告诉你,如果木卡盘没有卡住信号,有多少信号会被排队。

因此,请考虑将计时器设置为每秒关闭一次。但由于某种原因,你没有处理信号。说你把它封锁了5秒钟。超限计数将为4 - 您将/正在处理的信号和您错过的4。

在您的情况下,您将一次性计时器设置为在“超时”秒后关闭。信号已经传递完毕。将不再有信号,因此溢出总是为0,应该是。