stat 结构体中有三个 time_t 类型的字段,分别是 st_atime
,st_mtime
,st_ctime
.
1 三个时间的含义
1.1 st_atime
文件最后一次被访问的时间。
调用 creat(), mknod(), pipe(), utime(), and read()
这些函数会改变 st_atime 的值。
1.2 st_mtime
文件内容最后一次被修改的时间。
调用 creat(), mknod(), pipe(), utime(), and write()
这些函数会改变 st_mtime 的值。
1.3 st_ctime
文件状态最后一次被修改的时间,也就是 inode 结构体的内容(不包含这三个时间)最后一次被修改的时间。
调用chmod(), chown(), creat(), link(2), mknod(), pipe(), unlink(2), utime(), and write()
2 实验
- 创建一个文件
test.txt
. - 使用 stat 函数查看时间。st 程序的代码见 2.4 节
$ touch test.txt
$ ./st test.txt
上述命令执行完后
st_dev = 2049
st_ino = 831785
st_mode = 33204
st_nlink = 1
st_uid = 1000
st_gid = 1000
st_size = 0
st_atime = 1480336198
st_mtime = 1480336198
st_ctime = 1480336198
2.1 只修改 st_atime
$ cat text.txt
$ ./st test.txt
执行后
// 无关结果不展示了
st_atime = 1480336855 // 最近访问时间被更改,因为 cat 函数执行了读文件的操作
st_mtime = 1480336198
st_ctime = 1480336198
2.2 只修改 st_mtime
很遗憾,还没有办法做到只修改 st_mtime,修改了 st_mtime,必然会导致 st_ctime 的更改。想想为什么?
$ echo 'hello' > test.txt
$ ./st test.txt
执行后
// 无关结果不展示了
st_atime = 1480336855
st_mtime = 1480336973 // 最近更改时间被更改
st_ctime = 1480336973 // 最近状态被更改
2.3 只修改 st_ctime
$ chmod o+w test.txt
$ ./st test.txt
执行后
// 无关结果不展示了
st_atime = 1480336855
st_mtime = 1480336973
st_ctime = 1480337100 // 最近状态被更改
2.4 st 程序的代码
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <stdio.h>
int main(int argc, char* argv[]) {
struct stat st;
int r = stat(argv[1], &st);
if (r) {
perror("stat");
return -1;
}
printf("st_dev = %lld\n", st.st_dev);
printf("st_ino = %ld\n", st.st_ino);
printf("st_mode = %d\n", st.st_mode);
printf("st_nlink = %d\n", st.st_nlink);
printf("st_uid = %d\n", st.st_uid);
printf("st_gid = %d\n", st.st_gid);
printf("st_size = %ld\n", st.st_size);
printf("st_atime = %ld\n", st.st_atime);
printf("st_mtime = %ld\n", st.st_mtime);
printf("st_ctime = %ld\n", st.st_ctime);
return 0;
}
3 总结
本节需要理解三个时间的含义,以及这三个时间何时被更改。
最后一点需要注意的是,这里我们看到的时间,只是一个长整型,它表示的是1970年1月1日0时0分0秒到你获取时间那一刻的秒数。下一讲将介绍如果将它转换成人类可读的时间。