在4.2节中,我们讨论了Single UNIX Specification 2008版如何提高stat结构中时间字段的精度,从原来的秒提高到秒加上纳秒。每个文件属性所保存的实际精度依赖于文件系统的实现。对于把时间戳记录在秒级的文件系统来说,纳秒这个字段就会被填充为0.对于时间戳的记录精度高于秒级的文件系统来说,不足秒的值被转换成纳秒并记录在纳秒这个字段中。
对每个文件维护3个时间字段,它们的意义示于图4-19中。
字段 | 说明 | 例子 | 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选项则使其按状态更改时间排序。
图4-20列出了我们已说明过的各种函数对这3个时间的作用。回忆4.14节中所述,目录是包含目录项(文件名和相关的i节点编号)的文件,增加、删除或修改目录项会影响到它所在目录相关的3个时间。这就是与所引用的文件(或目录)的父目录相关的3个时间。例如,创建一个新文件影响到包含此新文件的目录,也影响新文件的i节点。但是,读或写一个文件只影响该文件的i节点,而对目录则无影响。