14-stat 结构体中的三个时间

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秒到你获取时间那一刻的秒数。下一讲将介绍如果将它转换成人类可读的时间。

  • 8
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值