在相关章节中,我们讨论了 Single UNIX Specification 2008 版如何提高 stat 结构中时间字段的精度,从原来的秒提高到秒加上纳秒。每个文件属性所保存的实际精度依赖于文件系统的实现。对于把时间戳记录在秒级的文件系统来说,纳秒这个字段就会被填充为 0。对于时间戳的记录精度高于秒级的文件系统来说,不足秒的值被转换成纳秒并记录在纳秒这个字段中。
对每个文件维护 3 个时间字段,它们的意义如下表所示。
| 字段 | 说明 | 例子 | ls(l) 选项 |
|---|---|---|---|
| st_atim / st_mtim / st_ctim | 文件数据的最后访问时间 / 文件数据的最后修改时间 / i 节点状态的最后更改时间 | read / write / chmod、chown | -u / 默认 / -c |
注意,修改时间(st_mtim)和状态更改时间(st_ctim)之间的区别。修改时间是文件内容最后一次被修改的时间。状态更改时间是该文件 i 节点最后一次被修改的时间。在本章中我们已说明了很多影响 i 节点的操作,如更改文件的访问权限、更改用户 ID、更改链接数等,但它们并没有更改文件的实际内容。因为 i 节点中的所有信息都是与文件的实际内容分开存放的,所以,除了要记录文件数据修改时间以外,还需要记录状态更改时间,也就是更改 i 节点中信息的时间。
注意,系统并不维护对一个 i 节点的最后一次访问时间,所以 access 和 stat 函数并不更改这三个时间中的任一个。
系统管理员常常使用访问时间来删除在一定时间范围内没有被访问过的文件。典型的例子是删除在过去一周内没有被访问过的名为 a.out 或 core 的文件。find(l) 命令常被用来进行这种类型的操作。
修改时间和状态更改时间可被用来归档那些内容已经被修改或 i 节点已经被更改的文件。
ls 命令按这 3 个时间值中的一个排序进行显示。系统默认(用-l 或-t 选项调用时)是按文件的修改时间的先后排序显示。-u 选项使 ls 命令按访问时间排序,-c 选项则使其按状态更改时间排序。
相关函数对这 3 个时间的作用总结如图表所示。回忆相关章节中所述,目录是包含目录项(文件名和相关的 i 节点编号)的文件,增加、删除或修改目录项会影响到它所在目录相关的 3 个时间。这就是与所引用的文件(或目录)的父目录相关的 3 个时间。例如,创建一个新文件影响到包含此新文件的目录,也影响新文件的 i 节点。但是,读或写一个文件只影响该文件的 i 节点,而对目录则无影响。

