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功能完成文件拷贝,在这一例子中,同样也不会修改文件的访问属性。
「最上川」
11 years, 7 months ago
Answers
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