time(time_t * timer)给出错误的结果,系统中没有时间漂移

时间:2019-02-06 13:17:35

标签: c time time.h

下面的代码用于做一些工作,直到下一个间隔睡觉。 为了计算睡眠时间,我使用以下逻辑。

time_t start = time(0);
time_t end = time(0);
int timeLeft = 0;
int interval = 300;
while(1)
{

    /* do something
     * lets say takes 5 to 20 seconds to execute
     */
    end = time(0);
    timeLeft = interval -(end - start);
    printf("timeLeft: %d, interval: %d, end: %u, start: %u",timeLeft,interval,end,start);
    sleep(timeLeft)
    start = time(0);
}

系统正常运行34小时后, timeLeft 大于300,这是永远不会发生的。 我检查了一下,系统没有时间漂移。

对于一个实例,当问题发生时,

  

timeLeft:11484,间隔:300,结束:1549402241,开始:1549413425

不知道以上情况如何发生? 需要帮助。

1 个答案:

答案 0 :(得分:0)

对问题的这种分析实际上并不能给出一个答案,但是由于太长而无法放入评论中,所以在这里进行。

查看代码后,看来问题出在结束<开始。但是 end = time(0)总是在 start = time(0)之后调用。

您的示例假定您可以减去 time_t 值并获得它们之间经过的秒数,但是C标准不保证这样做。您的代码似乎正在Linux的最新版本上运行,因此我看了一下GNU Libc manual,显然 time 返回了1月1日00:00:00以来的秒数。 1970年,并且time_t是一个long int。发生问题时,我还检查了 start end 的值,它们的值约为49年秒,并且自1月1日以来已为49年。 1970年,看来您的示例中的假设是正确的。

我的最佳猜测是,实际代码与您的示例之间存在一些显着差异。可能是在调用 end = time(0)之后发生的对 start = time(0)的调用,或者可能是对end = time(0)的调用)不会发生。

您可以通过将示例转换为实际程序并查看该程序是否存在相同问题来排除此情况。如果是这样,则可以发布该程序的代码。该网站鼓励人们创建Minimal, Complete, and Verifiable examples

与此同时,我还能做出其他一些猜测:

  1. 您的程序有多个线程,并且您的线程正在互相踩踏。
  2. 一些奇怪的编译器优化导致对 time(0)的调用被转移。