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

Linux上使用touch修改文件时间属性的限制

缘由

在Linux上我想多个进程对于同一个文件进行访问和修改,并且根据文件的最后修改时间来判断时间是否需要更新缓存中的文件,这样能够达到减少每次加载文件时间的损耗。

尝试的做法

每当我修改文件后,为了确保文件的最后修改时间的属性生效,会在执行一次touch命令;然后在进程中需要读取文件时候,通过与缓存的上次加载此文件时候的最后修改时间对比,如果当前文件的最后读取时间新余缓存中的记录,则加载此文件,否则使用缓存中的文件。

最后修改时间属性能够获取的精度

通过获取属性能够获取,发现最大能够获取的时间是纳秒级别的,也就是逻辑上,如果不是在同一纳秒内修改文件则都能够识别出来才对。

失败的尝试

当我使用上述方式时候,发现有些时候多次快速读写,这种判断会失效,然后就开始分析。

可能原因的猜测

是否touch命令修改时间的精度达不到呢?

实测代码分析(主要部分)

获取文件最后修改时间的代码

#include <sys/stat.h>timespec TouchTimeUtils::GetLastModifiedTime(const std::string &filePath)
{timespec currentTimeSpec;currentTimeSpec.tv_sec = 0;currentTimeSpec.tv_nsec = 0;struct stat attrib;if(0 == stat(filePath.c_str(), &attrib)){currentTimeSpec = attrib.st_mtim;}return currentTimeSpec;
}

touch文件的代码

void TouchTimeUtils::TouchFile(const std::string &filePath)
{std::string cmd = "touch " + filePath;system(cmd.c_str());
}

综合执行的代码

多次连续重复执行touch,查看执行后文件最后修改时间的属性值。

    std::string filePath = "/home/chaoyang/1.sh";for (int i = 0; i < 1000; ++i){TouchTimeUtils::TouchFile(filePath);auto ts1 = TouchTimeUtils::GetLastModifiedTime(filePath);TouchTimeUtils::TouchFile(filePath);auto ts2 = TouchTimeUtils::GetLastModifiedTime(filePath);TouchTimeUtils::TouchFile(filePath);auto ts3 = TouchTimeUtils::GetLastModifiedTime(filePath);std::cout << "index(" << i << "), " << "Time1(" << ts1.tv_sec << "," <<ts1.tv_nsec << "), "<< "Time2(" << ts2.tv_sec << "," <<ts2.tv_nsec << "), "<< "Time3(" << ts3.tv_sec << "," <<ts3.tv_nsec << ")" << std::endl;}

结果分析

部分结果展示

如下的结果是使用debug编译执行的结果,仅仅展示其中的一部分。

····
index(671), Time1(1726277174,228191425), Time2(1726277174,232191461), Time3(1726277174,232191461)
index(672), Time1(1726277174,232191461), Time2(1726277174,236191494), Time3(1726277174,236191494)
index(673), Time1(1726277174,236191494), Time2(1726277174,240191528), Time3(1726277174,240191528)
index(674), Time1(1726277174,240191528), Time2(1726277174,244191561), Time3(1726277174,244191561)
index(675), Time1(1726277174,244191561), Time2(1726277174,248191594), Time3(1726277174,248191594)
index(676), Time1(1726277174,248191594), Time2(1726277174,252191629), Time3(1726277174,252191629)
index(677), Time1(1726277174,252191629), Time2(1726277174,252191629), Time3(1726277174,256191663)
index(678), Time1(1726277174,256191663), Time2(1726277174,256191663), Time3(1726277174,260191697)
index(679), Time1(1726277174,260191697), Time2(1726277174,260191697), Time3(1726277174,264191729)
index(680), Time1(1726277174,264191729), Time2(1726277174,264191729), Time3(1726277174,268191765)
index(681), Time1(1726277174,268191765), Time2(1726277174,268191765), Time3(1726277174,272191798)
index(682), Time1(1726277174,272191798), Time2(1726277174,272191798), Time3(1726277174,276191832)
index(683), Time1(1726277174,276191832), Time2(1726277174,276191832), Time3(1726277174,280191865)
index(684), Time1(1726277174,280191865), Time2(1726277174,280191865), Time3(1726277174,280191865)
index(685), Time1(1726277174,284191898), Time2(1726277174,284191898), Time3(1726277174,284191898)
index(686), Time1(1726277174,288191933), Time2(1726277174,288191933), Time3(1726277174,288191933)
index(687), Time1(1726277174,292191967), Time2(1726277174,292191967), Time3(1726277174,292191967)
index(688), Time1(1726277174,296192001), Time2(1726277174,296192001), Time3(1726277174,296192001)
index(689), Time1(1726277174,300192033), Time2(1726277174,300192033), Time3(1726277174,300192033)
index(690), Time1(1726277174,304192069), Time2(1726277174,304192069), Time3(1726277174,304192069)
index(691), Time1(1726277174,308192102), Time2(1726277174,308192102), Time3(1726277174,308192102)
index(692), Time1(1726277174,312192136), Time2(1726277174,312192136), Time3(1726277174,312192136)
index(693), Time1(1726277174,312192136), Time2(1726277174,316192169), Time3(1726277174,316192169)
index(694), Time1(1726277174,316192169), Time2(1726277174,320192202), Time3(1726277174,320192202)
index(695), Time1(1726277174,320192202), Time2(1726277174,324192237), Time3(1726277174,324192237)
index(696), Time1(1726277174,324192237), Time2(1726277174,328192271), Time3(1726277174,328192271)
index(697), Time1(1726277174,328192271), Time2(1726277174,332192305), Time3(1726277174,332192305)
index(698), Time1(1726277174,332192305), Time2(1726277174,336192337), Time3(1726277174,336192337)
···

在上面的执行时间中,最前面的第多少次测试,后面三组数字分别是执行的时间(秒、纳秒),发现很多的连续几次的时间是完全相同的。

结论

在Linux系统中,使用touch来修改文件的最后修改数据属性,并不是每次都能在纳秒级别上修改到文件属性上,可能在极短时间内多次反映的修改时间会相同。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Unity同时启动多个Editor
  • 项目管理必备3大工具,助你的项目管理技能飞跃提升。
  • Git提交有乱码
  • ChatGPT 为何将前端框架从 Next.js 更换为 Remix以及框架的选择
  • WIFI | 硬件 基于MT7988D平台VC5772实现BE7200路由设计方案
  • 计算机组成原理(笔记3)
  • FEAD:fNIRS-EEG情感数据库(视频刺激)
  • CS61C 2020计算机组成原理Lecture03
  • 【Kubernetes】(K8S)彻底卸载详细教程
  • Spring Boot中的响应与分层解耦架构
  • vue3 自定义el-tree树形结构样式
  • Nginx+Tomcat(负载均衡、动静分离)
  • python毕业设计基于django+vue医院社区医疗挂号预约综合管理系统7918h-pycharm-flask
  • javaseday27异常、FIle、综合案例
  • ubuntu24安装vivado24(安装并解决若干错误)
  • “寒冬”下的金三银四跳槽季来了,帮你客观分析一下局面
  • 【162天】黑马程序员27天视频学习笔记【Day02-上】
  • Android组件 - 收藏集 - 掘金
  • cookie和session
  • magento 货币换算
  • MySQL QA
  • V4L2视频输入框架概述
  • Vue.js源码(2):初探List Rendering
  • 百度贴吧爬虫node+vue baidu_tieba_crawler
  • 关于springcloud Gateway中的限流
  • 技术发展面试
  • 面试题:给你个id,去拿到name,多叉树遍历
  • 三分钟教你同步 Visual Studio Code 设置
  • 学习ES6 变量的解构赋值
  • 我们雇佣了一只大猴子...
  • #Datawhale AI夏令营第4期#AIGC方向 文生图 Task2
  • (4)事件处理——(2)在页面加载的时候执行任务(Performing tasks on page load)...
  • (6) 深入探索Python-Pandas库的核心数据结构:DataFrame全面解析
  • (6)【Python/机器学习/深度学习】Machine-Learning模型与算法应用—使用Adaboost建模及工作环境下的数据分析整理
  • (C#)一个最简单的链表类
  • (LLM) 很笨
  • (苍穹外卖)day03菜品管理
  • (附源码)计算机毕业设计SSM疫情下的学生出入管理系统
  • (含笔试题)深度解析数据在内存中的存储
  • (转)PlayerPrefs在Windows下存到哪里去了?
  • (转)创业的注意事项
  • (自用)仿写程序
  • .net 提取注释生成API文档 帮助文档
  • .Net6使用WebSocket与前端进行通信
  • .net反编译工具
  • .Net高阶异常处理第二篇~~ dump进阶之MiniDumpWriter
  • .Net转Java自学之路—基础巩固篇十三(集合)
  • .vue文件怎么使用_vue调试工具vue-devtools的安装
  • /var/spool/postfix/maildrop 下有大量文件
  • @property括号内属性讲解
  • @reference注解_Dubbo配置参考手册之dubbo:reference
  • @SpringBootConfiguration重复加载报错
  • [ 云计算 | AWS 实践 ] Java 如何重命名 Amazon S3 中的文件和文件夹
  • [Android]Android P(9) WIFI学习笔记 - 扫描 (1)
  • [C/C++]数据结构 深入挖掘环形链表问题