c++怎么实现类似于Linux下touch命令修改文件访问时间【实战】

云丽酱_4389

云丽酱_4389

2026-03-28

714人浏览

原创

linux下用utimes()修改文件atime最直接:先stat读取原atime/mtime,构造timeval数组(tv[0]设atime、tv[1]保持原mtime),再调用utimes();注意避免传null或tv_sec=0导致时间重置。

c++怎么实现类似于linux下touch命令修改文件访问时间【实战】

用 utimes() 修改文件访问时间(atime)最直接

Linux 下 touch -a 的核心就是更新 atime,C++ 没有跨平台标准接口,但 Linux/macOS 上 utimes() 是最轻量、最贴近系统行为的选择。它接受微秒级精度时间戳,比老式 utime() 更准,也避开了 utimensat() 需要 AT_FDCWD 和 flag 参数的繁琐。

常见错误是传入 NULL 时间指针——这会让系统用当前时间覆盖 mtime *和* atime,而你只想动 atime;或者误把 tv_sec 设为 0,导致时间被重置成 1970 年。

  • 先用 stat() 读出原文件的 st_atime 和 st_mtime
  • 构造 timeval 数组:tv[0] 改 atime,tv[1] 保持原 mtime 不变
  • 调用 utimes("path", tv);返回 -1 且 errno == ENOENT 说明文件不存在
struct timeval tv[2];
struct stat st;
if (stat("foo.txt", &st) == 0) {
    tv[0].tv_sec = st.st_atime;  // 可改这里为新时间
    tv[0].tv_usec = 0;
    tv[1].tv_sec = st.st_mtime;
    tv[1].tv_usec = 0;
    utimes("foo.txt", tv);
}

想兼容 macOS?用 utimensat() 替代 utimes()

macOS 从 10.13 起已废弃 utimes(),链接时会警告,运行时也可能失败;utimensat() 是 POSIX.1-2008 标准,Linux 和新版 macOS 都支持,且能精确控制是否更新 atime/mtime/ctime。

关键区别在于:它用 timespec(纳秒级),不是 timeval(微秒级);第二个参数是 const struct timespec[2],顺序仍是 [atime, mtime];第三个参数必须传 AT_FDCWD,不能传文件描述符。

C++ Code Review Master
C++ Code Review Master

组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。

下载
  • 若只想更新 atime,把 tv_nsec 设为 UTIME_OMIT 表示跳过 mtime
  • 若两个都要设,两个 timespec 都得填有效值,不能留空
  • 注意头文件:<sys></sys> 和 <fcntl.h></fcntl.h> 缺一不可

为什么不用 futimens()?它不适用这个场景

futimens() 看起来更“现代”,但它操作的是已打开的文件描述符,而 touch 是路径操作——你得先 open() 再 futimens(),多一次系统调用,还容易因 O_RDONLY/O_WRONLY 模式影响后续行为。更麻烦的是:某些文件系统(如 ext4 默认挂载)启用了 relatime 或 noatime,即使调用成功,atime 也可能被内核忽略或延迟更新。

  • futimens() 适合在已持有 fd 的上下文中顺带更新时间,比如日志写入后同步 atime
  • 单独为改 atime 去 open 文件,反而增加出错点:权限不足、路径被 symlink 中断、文件被删除等
  • 实测中,utimes() 和 utimensat() 在 noatime 挂载下仍可强制写入(需 root 或 chmod +a 权限),futimens() 则不一定

绕不开的内核限制:noatime 和 relatime 会影响结果

即使代码完全正确,执行后 ls -lu 看不到 atime 变化,大概率是文件系统挂载选项在起作用。这不是程序 bug,而是内核策略。

  • noatime:彻底禁用 atime 更新,所有用户态调用均被静默忽略(root 除外)
  • relatime(默认):只在 atime 早于 mtime/ctime 时才更新,避免频繁磁盘写入
  • 检查方式:mount | grep "$(df . | tail -1 | awk '{print $1}')",看输出里有没有 noatime 或 relatime
  • 临时绕过:sudo mount -o remount,relatime /path/to/fs;但生产环境别乱改

真正难搞的不是怎么调系统调用,而是确认目标文件是否落在受控挂载点上——这点连 touch 命令本身都无能为力。

C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!

相关文章

c++速学教程(入门到精通)
c++速学教程(入门到精通)

c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

c++

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
python中print函数的用法
python中print函数的用法

python中print函数的语法是“print(value1, value2, ..., sep=' ', end='\n', file=sys.stdout, flush=False)”。本专题为大家提供print相关的文章、下载、课程内容,供大家免费下载体验。

2023.09.27

2680

5

python print用法与作用
python print用法与作用

本专题整合了python print的用法、作用、函数功能相关内容,阅读专题下面的文章了解更多详细教程。

2026.02.03

249

24

c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

2023.09.22

549

3

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

2024.03.01

1678

6

c语言const用法
c语言const用法

const是关键字,可以用于声明常量、函数参数中的const修饰符、const修饰函数返回值、const修饰指针。详细介绍:1、声明常量,const关键字可用于声明常量,常量的值在程序运行期间不可修改,常量可以是基本数据类型,如整数、浮点数、字符等,也可是自定义的数据类型;2、函数参数中的const修饰符,const关键字可用于函数的参数中,表示该参数在函数内部不可修改等等。

2023.09.20

2098

7

C++ 智能指针与现代内存管理
C++ 智能指针与现代内存管理

深入讲解 C++ 现代内存管理的核心工具——智能指针,涵盖 unique_ptr 独占所有权语义、shared_ptr 引用计数机制与循环引用问题、weak_ptr 弱引用的应用场景、make_unique/make_shared 工厂函数的性能优势、自定义删除器的编写、RAII 资源管理思想的实践,以及从裸指针迁移到智能指针的重构策略,帮助开发者编写安全无泄漏的现代 C++ 代码。

2026.04.23

339

31

硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

2023.10.19

3108

3

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

2025.10.17

4669

12

php8.4实现接口限流的教程
php8.4实现接口限流的教程

PHP8.4本身不内置限流功能,需借助Redis(令牌桶)或Swoole(漏桶)实现;文件锁因I/O瓶颈、无跨机共享、秒级精度等缺陷不适用高并发场景。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2025.12.29

3729

9

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C++ Core Guidelines
C++ Core Guidelines

共0课时 | 0人学习

C++ Reference
C++ Reference

共0课时 | 0人学习

C++ 官方标准说明
C++ 官方标准说明

共0课时 | 0人学习