最新消息:yaf表单扩展中新增加了浮点数、日期和集合的校验。php yaf框架扩展实践三——表单

linux中atime,ctime和mtime的区别和示例演示

Linux 2441浏览 0评论

关于linux中的atime、ctime和mtime,如果不仔细理清一下,还是蛮容易弄混的。

猜测man手册中应当有这三个时间的相关说明,于是尝试man atime、man st_atime都没有相关文档。后来想到stat可以查看文件的这三个时间,就用man stat查找,虽然有文档,但是没有这三个时间的相关说明。正一筹莫展之际,突然想到c语言的stat函数也可以查看文件的状态,立马就用man 2 stat查看手册,果然找到了,摘抄在这里:

The  field  st_atime  is  changed  by file accesses, for example, by execve(2), mknod(2), pipe(2), utime(2) and read(2) (of more than zero bytes).  Other routines, like mmap(2), may or may not update st_atime.

The field st_mtime is changed by file modifications, for example, by mknod(2), truncate(2), utime(2) and write(2) (of more than zero bytes).  Moreover, st_mtime of a directory  is  changed  by
the creation or deletion of files in that directory.  The st_mtime field is not changed for changes in owner, group, hard link count, or mode.

The field st_ctime is changed by writing or by setting inode information (i.e., owner, group, link count, mode, etc.).

有了英文手册,理解起来就简单些了,从上面分析:

  • atime:access time文件被访问的最后时间。
  • mtime:modify time文件内容被修改的时间。
  • ctime:change time文件的inode内容修改的时间。

这样还是不容易理解,如果从英文解释中的函数来理解就容易分清了。例如atime中有提到execve(2)和read(2)函数,其实就是表示文件执行和读取时该时间被修改;mtime中的write(2)就表示内容写入时该时间被修改;ctime中的owner和group表示修改文件所属用户和用户组时该时间被修改。

测试下atime

用c语言编写一个简单的功能,编译成a.out,使用stat命令查看a.out的三个时间值:

$ stat a.out 

......
Access: 2013-01-15 10:49:50.032767384 +0800
Modify: 2013-01-15 10:49:50.032767384 +0800
Change: 2013-01-15 10:49:50.032767384 +0800
......

然后执行一下这个文件,再次查看:

$ ./a.out
$ stat a.out

......
Access: 2013-01-15 10:52:31.912772564 +0800 
Modify: 2013-01-15 10:49:50.032767384 +0800
Change: 2013-01-15 10:49:50.032767384 +0800
......

可以发现atime发生了改变。

测试下mtime

创建一个新文件:

$ echo 'hello' > test.txt
$ stat test.txt

......
Access: 2013-01-15 11:13:43.712813262 +0800
Modify: 2013-01-15 11:13:43.712813262 +0800
Change: 2013-01-15 11:13:43.712813262 +0800
......

修改文件:

$ echo 'world' > test.txt
$ stat test.txt 

......
Access: 2013-01-15 11:13:43.712813262 +0800
Modify: 2013-01-15 11:13:57.232813694 +0800
Change: 2013-01-15 11:13:57.232813694 +0800
......

可以发现mtime和ctime都发现了改变,为什么ctime也会发生改变呢?因为文件的inode内存储了文件的字节数、文件拥有者的id等文件相关属性,修改了文件内容后,相关文件属性也会被更新,相当于修改了inode的内容,所以ctime也发生了变化。

另外还有一个疑问:inode也存储了atime、mtime和ctime,那么上例改变atime的时候,inode的内容发生了变化,为什么ctime没有发生变化呢?非常不解。

测试下ctime

创建新文件ctime.txt

$ echo 'hello' > ctime.txt
$ stat ctime.txt

......
Access: 2013-01-15 11:22:02.908829236 +0800
Modify: 2013-01-15 11:22:02.908829236 +0800
Change: 2013-01-15 11:22:02.908829236 +0800
......

修改time.txt的权限

$ chmod 777 ctime.txt 
$ stat ctime.txt

......
Access: 2013-01-15 11:22:02.908829236 +0800
Modify: 2013-01-15 11:22:02.908829236 +0800
Change: 2013-01-15 11:22:20.268829792 +0800
......

可以发现ctime发生了改变。

小结

这边主要是针对普通文件做了测试,关于目录的问题,和普通文件类似,只是目录本身的内容存储的是目录下的所有文件的文件名。如果目录内的文件有新建、改名、删除等操作,那么目录本身的内容就会被修改,可以使用vim查看目录本身存储的内容。

转载请注明:快乐编程 » linux中atime,ctime和mtime的区别和示例演示

发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址