更改文件访问时间和修改时间 -- utime

2014-07-21 11:25:14   最后更新: 2015-02-21 18:45:14   访问数量:1032




每个文件都有三个时间字段:

|--------------+------------------------------+----------------+----------|

|      字段    |             说明             |      例子      |  ls选项  |

|   st_atime   |    文件数据的最后访问时间    |      read      |    -u    |

|   st_mtime   |    文件数组的最后修改时间    |     write      |   默认   |

|   st_ctime   |    i节点状态的最后修改时间   |  chmod、chown  |    -c    |

|--------------+------------------------------+----------------+----------|

 

  1. 系统并不保存对一个i节点的最后一次访问时间,所以access和stat函数并不更改三个时间中的任何一个
  2. 创建文件会影响到包含此新文件的父目录的 st_mtime 和 st_ctime ,也会影响爱你感到该文件的i节点
  3. 读写一个文件,只会影响到该文件的i节点,而对其父目录没有影响

 

int utime(const char * filename, struct utimbuf * time);

 

定义于<utime.h>头文件中,若调用成功返回0,否则返回-1

struct utimbuf { time_t actime; time_t modtime; };

 

这两个时间都是日历时间,即自1970年1月1日0点以来的秒数

 

进程有效用户ID必须等于该文件的所有者ID,

如果time指针为NULL,则将文件访问时间和修改时间设置为当前时间。

如果time不为空,则将时间设置为指定值

注意,我们不能设置st_ctime,当调用utime时,会自动更新该字段

 

e.g.

#include <stdio.h> #include <utime.h> #include <unistd.h> #include <fcntl.h> #include <sys/stat.h> int main () { struct stat str_stat; if (lstat("tmp", &str_stat)) { perror ("stat: "); return -1; } open ("tmp", O_TRUNC); return 0; }

 

创建非空文件tmp后执行该程序清空tmp文件,结果如图:

 

 

可见,进程更新了tmp文件的最后修改时间和i节点更改时间,但是却没有更新文件的最后访问时间

 

#include <stdio.h> #include <utime.h> #include <unistd.h> #include <fcntl.h> #include <sys/stat.h> int main () { struct stat str_stat; if (lstat("tmp", &str_stat)) { perror ("stat: "); return -1; } open ("tmp", O_TRUNC); struct utimbuf str_utime; str_utime.actime = str_stat.st_atime; str_utime.modtime = str_stat.st_mtime; if (utime ("tmp", &str_utime)) { perror ("utime: "); return -1; } return 0; }

 

 

改动后的程序在修改文件后恢复文件的访问时间和修改时间,执行结果如图:

 

 

可见,进程执行后,文件只更新了i节点修改时间

 

如果tmp为空,则三个时间均不变

 






读书笔记      技术帖      操作系统      os      linux      unix      龙潭书斋      时间      apue      unix环境高级编程      文件系统      文件      st_atime      st_mtime      st_ctime     


京ICP备15018585号