在linux中atime,ctime和mtime这些函数如果一不小心还真可能搞混乱了,下面我来给大家整理一下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发生了改变,linux中atime,ctime和mtime的区别详解linux操作系统》(https://www.unjs.com)。
测试下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查看目录本身存储的内容。