C / UNIX每x毫秒执行一次函数

时间:2011-05-16 18:53:36

标签: c unix posix

如何使用alarm()或sleep每1000毫秒执行一次函数?如果函数在1000毫秒内没有执行或完成,我希望程序执行其他操作。

编辑:添加了伪代码

while(true) {
alarm(1000);
execute function;
sleep(1000);
alarm(0);
}

现在,如果警报(1000)信号SIGALRM是我可以调用其他功能的地方吗? 我对这类东西不熟悉,所以甚至不确定我是否正确使用它。

3 个答案:

答案 0 :(得分:7)

要求有多清晰,即你能承受多少抖动?

什么版本的UNIX?

基本上,如果这是一个艰难的截止日期 - 听起来像是一个 - 你需要做一些特殊的事情,因为基本的UNIX并不是一个真正的硬实时系统。

让我们假设您的意思是Linux。你想要

  • 使用 nice(2)来提高流程优先级
  • 使用细粒度计时器,与 ualarm(3)
  • 一样

那可能。如果你需要更细粒度或更可预测的时序,那么你可能需要编写一个内核扩展,它可以用内核定时器驱动。 (Solaris对硬实时有一些改进的支持,但它仍然不是一个真正的硬实时系统。)

如果您可以使用实时Linux或UNIX,生活将变得相当容易。这是一个list of some options。这是一个article you might find usefui.

<强>更新

您还应该查看 nanosleep(2) setitimer(2)。请注意,所有这些都表示区间至少参数中的区间。如果你有一个艰难的截止日期,你需要等待一些小于实际的间隔,然后找出如何处理你的千毫秒的任何变化。

答案 1 :(得分:2)

我在Linux上使用此功能在几毫秒内“休眠”:

void Sleep(unsigned int milliSeconds)
{
    struct timespec req = {0};

    time_t seconds  = (int) (milliSeconds / 1000);
    milliSeconds    = milliSeconds - (seconds * 1000);
    req.tv_sec      = seconds;
    req.tv_nsec     = milliSeconds * 1000000L;

    while (nanosleep(&req, &req) == -1)
        continue;
}

答案 2 :(得分:1)

while (1) {
    sleep(1);
    /* Act */
}

如果您需要更严格的延迟,通常的方法是调用没有fds和低超时的select()。