linux cp命令为何不会修改源文件的访问时间(Access time)


RT,一个很简单的测试程序:

   
  ajaxhe@bbs:~/program/apue/ch14$ stat ch14-4.c
  
File: "ch14-4.c"
Size: 1399 Blocks: 8 IO Block: 4096 普通文件
Device: 805h/2053d Inode: 21503316 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 1007/ ajaxhe) Gid: ( 1007/ ajaxhe)
Access: 2012-12-10 18:10:07.320437053 +0800
Modify: 2012-12-07 20:05:32.000437237 +0800
Change: 2012-12-07 20:05:32.036989833 +0800

拷贝源文件:

   
  ajaxhe@bbs:~/program/apue/ch14$ date
  
2012年 12月 11日 星期二 08:51:55 CST
ajaxhe@bbs:~/program/apue/ch14$ cp ch14-4.c ch14-4.c_back

再查看源文件ch14-4的属性:

   
  ajaxhe@bbs:~/program/apue/ch14$ stat ch14-4.c
  
File: "ch14-4.c"
Size: 1399 Blocks: 8 IO Block: 4096 普通文件
Device: 805h/2053d Inode: 21503316 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 1007/ ajaxhe) Gid: ( 1007/ ajaxhe)
Access: 2012-12-10 18:10:07.320437053 +0800
Modify: 2012-12-07 20:05:32.000437237 +0800
Change: 2012-12-07 20:05:32.036989833 +0800
ajaxhe@bbs:~/program/apue/ch14$

源文件的访问时间(Access)竟然没有变化。

先说下个人的理解:既然要拷贝源文件,肯定要读源文件才可以,既然读了就会修改源文件的访问时间。
为何这个测试结果与我之前的猜测不一致,哪里出了问题呢?
谢谢!

PS:
linux mmap返回值问题 引发我对这个问题的思考,用mmap的存储映射I/O功能完成文件拷贝,在这一例子中,同样也不会修改文件的访问属性。

Linux shell 文件系统

「最上川」 11 years, 10 months ago

access time不更新的问题有历史原因的。
在2.6内核之前,Access time顾名思义,每次访问的时候,都会更新这个atime,
但后来发现OS更新atime的开销很大,尤其是读频繁的环境。

所以后来mount推出了一个noatime的选项,来禁止更新atime。

再后来为了兼容atime,又增加了一个兼容的选项relatime,只有在modify time大于access time时,才更新文件的access time ,这也成为了很多系统的默认设置。

所有,有时候,access time看起来就不那么靠谱了。

订书钉IKI answered 11 years, 10 months ago

Your Answer