C语言中用定时器计时

标签 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);
        }
    }
}

最佳答案

如果你想在繁忙的循环中进行检查和比较,你可以简单地调用clock_gettime并完全避免计时器。 计时器的全部意义在于避免这种繁忙的循环。

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

#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处于等待循环中。仅调用一次不会使触发对象自行自动更新。

关于C语言中用定时器计时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55666829/

相关文章:

你能解释打印 union 成员的结果吗?

c - 具有最小参数的可变参数函数

C getopenfilename 获取文件名

ruby - 如何将持续时间(以毫秒为单位)显示为格式正确的字符串?

java - 在 Android 中暂停和恢复倒数计时器和进度条?

c - 关于在偏移量 : what is GCC complaining about? 处访问字节的 GCC 警告

project-management - 您如何为从未做过的事情提供有效的时间估计?

java - 将时间 "PT10H30M"转换为 "10:30 AM"时间JAVA Android

visual-c++ - 如何消除mfc中删除背景的闪烁

c++ - 刷新 GLUT 窗口