Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在C(Linux)中编写计时器?_C_Linux_Timer - Fatal编程技术网

如何在C(Linux)中编写计时器?

如何在C(Linux)中编写计时器?,c,linux,timer,C,Linux,Timer,可能重复: 我是如何在C中创建计时器的?我想每5秒执行一次特定动作,每2秒执行一次 我该如何实现这一目标?有人能指出一些好的链接或代码吗 问题不在于设置周期计时器,而在于设置两个具有不同周期的计时器 不幸的是,2不能除以5,但我们可以有一个1s分辨率计时器和一个计数器,当计数器是2的倍数或5的倍数时,你可以做你想要的。您可以像往常一样使用计时器注册信号处理程序,但此处理程序应如下所示: static int cnt = 0; int handler(int) { cnt++;

可能重复:

我是如何在C中创建计时器的?我想每5秒执行一次特定动作,每2秒执行一次


我该如何实现这一目标?有人能指出一些好的链接或代码吗

问题不在于设置周期计时器,而在于设置两个具有不同周期的计时器

不幸的是,2不能除以5,但我们可以有一个1s分辨率计时器和一个计数器,当计数器是2的倍数或5的倍数时,你可以做你想要的。您可以像往常一样使用计时器注册信号处理程序,但此处理程序应如下所示:

static int cnt = 0;

int handler(int) {
    cnt++;

    if (cnt % 2 == 0) {
        action_a();
    } 

    if (cnt % 5 == 0) {
        action_b();
    }
}
为了消除溢出问题,我们可以在达到2和5的倍数时将计数器重置为0,例如:

int handler(int) {
    cnt++;

    if (cnt == 10)
    {
        cnt = 0;
    }

    if (cnt % 2 == 0) {
        action_a();
    } 

    if (cnt % (2*5) == 0) {
        action_b();
    }
}

请注意,这种技术可以很好地推广到2个以上的周期,但如果运气不好,最小的公分母可能是一个非常小的周期,因此您可以在很少使用的情况下获得较高的计时器信号速率。例如,如果你有一个999ms的周期和一个1000ms的周期,你最终会每毫秒有一个信号,这在精度和开销方面都不是很理想,但对于2s和5s来说,每秒有一个信号应该是可以接受的。

问题不在于设置周期计时器,但是有两个不同周期的计时器

不幸的是,2不能除以5,但我们可以有一个1s分辨率计时器和一个计数器,当计数器是2的倍数或5的倍数时,你可以做你想要的。您可以像往常一样使用计时器注册信号处理程序,但此处理程序应如下所示:

static int cnt = 0;

int handler(int) {
    cnt++;

    if (cnt % 2 == 0) {
        action_a();
    } 

    if (cnt % 5 == 0) {
        action_b();
    }
}
为了消除溢出问题,我们可以在达到2和5的倍数时将计数器重置为0,例如:

int handler(int) {
    cnt++;

    if (cnt == 10)
    {
        cnt = 0;
    }

    if (cnt % 2 == 0) {
        action_a();
    } 

    if (cnt % (2*5) == 0) {
        action_b();
    }
}

请注意,这种技术可以很好地推广到2个以上的周期,但如果运气不好,最小的公分母可能是一个非常小的周期,因此您可以在很少使用的情况下获得较高的计时器信号速率。例如,如果你有一个999ms的周期和一个1000ms的周期,你最终会得到一个每毫秒一次的信号,这在精确度和开销方面都不是很理想,但是对于2s和5s来说,每秒一次的信号应该是可以接受的。

C本身并没有提供定时器实用程序。你所处的环境是什么?窗户?Linux?您可以使用哪些库?我正在使用Linux环境(Ubuntu 12.04)。我不太清楚我可以访问哪些库,也许我可以安装所需的库。我如何交错两个计时器,比如一个2秒,另一个5秒。C本身不提供计时器实用程序。你所处的环境是什么?窗户?Linux?您可以使用哪些库?我正在使用Linux环境(Ubuntu 12.04)。我不太清楚我可以访问哪些库,也许我可以安装所需的库。我如何交错两个计时器,一个2秒,另一个5秒。