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

【学习笔记】系统时间跳变会影响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.xdnf.cn/news/18766.html

相关文章:

  • Matlab使用——开发上位机APP,通过串口显示来自单片机的电压电流曲线,实现光伏I-V特性监测的设计
  • es-toolkit 是一个现代的 JavaScript 实用库
  • UE4生成Target文件
  • 【RAGFlow代码详解-11】知识库管理
  • 无人机倾斜摄影农田航线规划
  • ProfiNet 转 Ethernet/IP基于西门子 S7 - 1500 与罗克韦尔 PLC 的汽车零部件加工线协同案例
  • 【QT学习之路】-Qt入门
  • 解决Windows更新后WPF程序报TypeLoadException异常的问题
  • Node.js(3)—— fs模块
  • 3D游戏角色建模资源搜索指南(资料来源于网络)
  • 恒坤新材科创板IPO上市关注,致力推动集成电路材料国产化
  • 领克08 EM-P新款官图发布,外观微调并增激光雷达
  • CentOS 7 服务器初始化完整流程
  • WhisperLiveKit:实时语音转文本
  • Vue3核心概念之构造函数和普通函数
  • Dify智能体平台二次开发笔记(10):企业微信5.0 智能机器人对接 Dify 智能体
  • LeetCode - 20. 有效的括号
  • 深入浅出理解支持向量机:从原理到应用,解锁分类算法的核心密码
  • 【golang长途旅行第32站】反射
  • 【大前端】React统计所有网络请求的成功率、失败率以及统一入口处理失败页面
  • 基于Android的超市购物系统的设计与实现、基于android的在线商城app/基于android的在线销售系统app#android
  • CVPR论文速递 | DL3DV-10K:10K+真实场景,打破三维视觉数据荒!
  • (论文速读)Prompt Depth Anything:让深度估计进入“提示时代“
  • 抽签占卜抖音快手微信小程序看广告流量主开源
  • 基于SpringBoot的演唱会网上订票系统的设计与实现(代码+数据库+LW)
  • 深入浅出理解支持向量机(SVM):从原理到实践
  • 《鸿蒙开发 3 天速成:核心知识点 + 实战案例精讲》
  • Uniapp(Vue2)Api请求封装
  • 解决VSCode无法下载服务器端 Server问的题
  • vue3 + jsx 中使用native ui 组件插槽