【学习笔记】系统时间跳变会影响time接口解决措施
【学习笔记】系统时间跳变会影响time接口解决措施
一、测试
最开始也是想验证系统时间变化会不会影响sleep接口的睡眠时间,就用time接口来获取记录改变的时间。发现系统time接口是获取的系统时间,那么如果系统时间变化了,程序中用到这个time接口的地方不就会有问题吗?
先看一下验证过程:
#include <stdio.h>
#include <unistd.h>
#include <time.h>int main() {printf("Testing sleep with time jump...\n");time_t start = time(NULL);printf("Start time: %s", ctime(&start));printf("Sleeping for 10 seconds...\n");sleep(10);time_t end = time(NULL);printf("End time: %s", ctime(&end));printf("Expected: 10 seconds, Actual: %ld seconds\n", end - start);return 0;
}
1、执行程序之后,修改系统时间快60s
Testing sleep with time jump...
Start time: Fri Aug 22 14:46:17 2025
Sleeping for 10 seconds...
End time: Fri Aug 22 14:47:27 2025
Expected: 10 seconds, Actual: 70 seconds
实际休眠还是10s
2、执行程序之后,修改系统时间慢60s
Testing sleep with time jump...
Start time: Fri Aug 22 14:55:13 2025
Sleeping for 10 seconds...
End time: Fri Aug 22 14:54:23 2025
Expected: 10 seconds, Actual: -50 seconds
实际休眠还是10s
结论:sleep接口函数内部实现不是基于系统时间的,但是time接口是基于系统时间,所以时间跳变并不影响sleep的睡眠时间。
二、解决
那就基于time接口来解决这个问题,不用time接口,换一个接口。
开始时间: 4742秒 49025922纳秒
结束时间: 4752秒 49297801纳秒
经过的时间: 10000毫秒
#include <time.h>
#include <stdio.h>
#include <unistd.h>// 获取单调时间(程序运行期间保持稳定)
struct timespec get_monotonic_time()
{struct timespec ts;clock_gettime(CLOCK_MONOTONIC, &ts); // 读取单调时间return ts;
}// 打印timespec结构的时间(秒.纳秒)
void print_timespec(const char* label, struct timespec ts)
{printf("%s: %ld秒 %ld纳秒\n", label, ts.tv_sec, ts.tv_nsec);
}int main() {// 记录开始时间struct timespec start_time = get_monotonic_time();print_timespec("开始时间", start_time);// 停留的10s修改系统时间sleep(10); // 记录结束时间struct timespec end_time = get_monotonic_time();print_timespec("结束时间", end_time);// 计算经过的毫秒数long elapsed_sec = end_time.tv_sec - start_time.tv_sec;long elapsed_nsec = end_time.tv_nsec - start_time.tv_nsec;// 处理纳秒可能为负的情况(例如end_time的纳秒小于start_time)if (elapsed_nsec < 0) {elapsed_sec--;elapsed_nsec += 1000000000; // 1秒 = 1e9纳秒}long elapsed_ms = elapsed_sec * 1000 + elapsed_nsec / 1000000;printf("经过的时间: %ld毫秒\n", elapsed_ms);return 0;
}