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, 7 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, 7 months ago

Your Answer