在C

时间:2019-04-13 14:58:57

标签: c time timer posix

我想在特定时间内运行C程序。在这段时间之后,该程序应终止。我搜索了一些有关此文档的文档,但其中许多文档都使用sleep函数。我不想使用它。我想在无限循环中检查当前时间是否大于目标时间。

例如下面的代码,我的目标时间是5,并且当运行时间大于5时,程序应该终止。

但是代码导致无限循环。我该如何解决这个问题?

void thread_handler(union sigval sv) {
    char *s = sv.sival_ptr;
    /* Will print "5 seconds elapsed." */
    puts(s);
}

int main(void) {
    char info[] = "5 seconds elapsed.";
    timer_t timerid;
    struct sigevent sev;
    struct itimerspec trigger;
    struct itimerspec triggerAfter;

    memset(&sev, 0, sizeof(struct sigevent));
    memset(&trigger, 0, sizeof(struct itimerspec));

    sev.sigev_notify = SIGEV_THREAD;
    sev.sigev_notify_function = &thread_handler;
    sev.sigev_value.sival_ptr = &info;

    timer_create(CLOCK_REALTIME, &sev, &timerid);

    trigger.it_value.tv_sec = 5;

    timer_settime(timerid, 0, &trigger, NULL); 

    timer_gettime(timerid,&trigger);
    while (1) {
        if ((int)trigger.it_value.tv_sec > 5) { //checking the current time is bigger than the target time, it it is then exit from the program
            timer_delete(timerid);
            exit(0);
        }
    }
}

1 个答案:

答案 0 :(得分:2)

如果要在繁忙的循环中进行检查和比较,则只需调用:=即可,完全避免使用计时器。 计时器的全部目的是避免此类繁忙的循环。

在您的情况下,您的主线程可以简单地暂停,并且您可以退出运行的thread_handler函数 在计时器处理程序的专用线程上。

clock_gettime

如果您仍然想忙于检查,则需要在等待循环中使用#include <time.h> #include <signal.h> #include <string.h> #include <stdlib.h> #include <stdio.h> #include <unistd.h> void thread_handler(union sigval sv) { char *s = sv.sival_ptr; /* Will print "5 seconds elapsed." */ puts(s); exit(0); } int main(void) { char info[] = "5 seconds elapsed."; timer_t timerid; struct sigevent sev; struct itimerspec trigger; struct itimerspec triggerAfter; memset(&sev, 0, sizeof(struct sigevent)); memset(&trigger, 0, sizeof(struct itimerspec)); sev.sigev_notify = SIGEV_THREAD; sev.sigev_notify_function = &thread_handler; sev.sigev_value.sival_ptr = &info; if(0>timer_create(CLOCK_REALTIME, &sev, &timerid)) return perror("timer_create"),1; trigger.it_value.tv_sec = 5; if(0>timer_settime(timerid, 0, &trigger, NULL)) return perror("timer_settime"),1; pause(); } 。仅调用一次将不会自动timer_gettime对象自动更新。