当前位置: 首页 > news >正文

【学习笔记】系统时间跳变会影响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;
}
http://www.dtcms.com/a/352189.html

相关文章:

  • 相关法律、法规知识(五)
  • 单层膜可改善无铅钙钛矿太阳能电池
  • Java 企业应用单点登录(SSO)实现方案详解
  • 创维桌面云终端-创维LB2002-白盒-晶晨S905L3A-2+8G-线刷刷机包
  • 实验2 天气预报
  • Ultra Accelerator Link(UALink)Consortium
  • 网站测试报告:WEB应用反CSRF的本质与防御机制
  • 解决 pdf.mjs 因 MIME 类型错误导致的模块加载失败问题
  • day1_线性回归的实现 李沐动手学深度学习pytorch记录
  • 吱吱企业通讯软件保障企业办公安全与效率,助力企业高效发展
  • (LeetCode 每日一题) 3000. 对角线最长的矩形的面积(数组)
  • Jmeter基础:Jmeter聚合报告
  • 6pen Art
  • 校园勤工俭学微信小程序的设计与实现:基于数字化服务生态的赋能体系构建
  • Vue2(七):配置脚手架、render函数、ref属性、props配置项、mixin(混入)、插件、scoped样式
  • C/C++ 数据结构 —— 树(2)
  • Leetcode 1049. 最后一块石头的重量 II 动态规划-01背包
  • LeetCode-22day:多维动态规划
  • Docker详细学习
  • 税务岗位职场能力解析与提升路径规划
  • 固定资产管理系统核心模块拆解:全流程管理逻辑
  • 如何利用ArcGIS探究环境与生态因子对水体、土壤、大气污染物等影响
  • 【服务器】Apache Superset MCP接入与使用
  • postman使用
  • golang 8函数
  • pytorch_grad_cam 库学习笔记——基类BaseCAM
  • 使用 Docker、Jenkins、Harbor 和 GitLab 构建 CI/CD 流水线
  • Unity:游戏性能优化!之把分散在各个游戏角色GameObject上的脚本修改为在一个脚本中运行。这样做会让游戏运行更高效?
  • Caddy + CoreDNS 深度解析:从功能架构到性能优化实践(下)
  • 【BurpSuite 插件开发】实战篇(十六-终章)性能优化实践:线程管理到正则匹配的全方位提升