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
相关产品推荐
相关产品推荐

