You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

gettimeofday()异常行为排查:时间跳变问题

问题分析与解决方案

核心问题:gettimeofday() 依赖墙上时钟,易受系统时间调整影响

你遇到的大幅时间跳变,根源在于 gettimeofday() 获取的是墙上时钟(wall-clock time)——这个时间和系统显示的时间一致,会被NTP时间同步、手动修改系统时间等操作直接影响。一旦系统在程序运行时调整了时间,gettimeofday() 的返回值就会突然跳变,导致你看到的时间差异常。

至于偶尔的1ms误差,是正常现象:usleep() 的精度本身有限,加上printf()等操作的耗时,会让实际间隔和预期的2000ms有微小偏差。

解决方案:改用单调时钟(CLOCK_MONOTONIC)

要避免时间跳变,应该使用单调递增时钟,它从系统启动开始计时,不受系统时间调整的影响。POSIX标准提供的clock_gettime()函数支持这种时钟类型。

修改后的代码如下:

#include <time.h> // 引入clock_gettime所需头文件

long get_time_in_ms()
{
    struct timespec ts;
    // 使用CLOCK_MONOTONIC时钟
    clock_gettime(CLOCK_MONOTONIC, &ts);
    return ts.tv_sec * 1000 + ts.tv_nsec / 1000000;
}

void show_time(long actual_time)
{
    static long time;

    if (time == 0)
        time = get_time_in_ms();
    printf("%ld ms\n", actual_time - time);
}

int main(void)
{
    long last_eat;
    while (1) // 替换true为1,兼容更多编译器
    {
        last_eat = get_time_in_ms();
        printf("I eat :) ");
        show_time(last_eat);
        usleep(2000000);
    }
}

编译注意事项

部分旧版Linux系统编译时需要链接实时库,添加-lrt参数:

gcc your_code.c -o your_program -lrt

新系统(如内核2.6.17及以上)无需此参数,clock_gettime()已集成到标准库中。

额外说明

  • 永远不要用墙上时钟来测量程序运行的时间间隔,这类场景必须用单调时钟。
  • usleep() 本身精度不高,如果需要更精准的定时,可以考虑用nanosleep()或者基于clock_gettime()实现的自定义定时逻辑。

内容的提问来源于stack exchange,提问作者marcosto 29

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 14:13:18