28 文件的时間戳
標準的 POSIX 文件有三個时間戳:文件最后一次读取的时間戳 (以下简称:atime) ,文件最后一次修改的时間戳 (以下简称:mtime) ,最后一次变更文件元信息状态的时間戳 (以下简称:ctime) 。有些文件系统可以支持第四個时間戳:創建文件时的时間戳 (以下简称:birthtime) ,根据其定义,这一個时間永远不会变。
ctime 变更常见的一個例子是更改文件的权限。更改文件的权限时不會访问文件,所以 atime 是不會改变的,也不修改文件,因此 mtime 也不會改变。然而,文件本身的一些东西却已经改变了,这一點在某些地方必须得注意。这也便是 ctime 的工作机制。这一點是非常必要的。例如,备份程序生成的文件副本包括了新的权限。另一个更改 ctime 而不影响其它的操作是对文件重命名。
当您閱读、编写或变更文件的属性时,文件的 atime, mtime, 和 ctime 將會被設置為當前的系统时間。and searching a directory counts as reading it. 一個文件的 atime 和 mtime 也可以通过 touch 命令来設置 (參閱 touch invocation)。在实践中,时間戳并不以这种方式来更新。
出于对效率的考虑,很多系统都“懒“得更新 atimes :當程序访問一个文件时,它们可能會延时更新文件的 atimes ,或者文件在最近有访问过就不更新 atimes ,又或者就不更新 atimes 。类似地这种“懒”也适用于 mtimes 和 ctimes , 虽然有时并不會那么地极端。
有些系统會虚拟一個时間戳,而不是能直接支持生成这些时間戳,而这些虚拟的时間戳就可能与这里所说的时間戳不一致。例如,一个系统可以通用使用 mtime 来虚拟一个 atime 或 ctime。
“當前“的时間取决于使用的平台。带有网络文件系统的平台通常会使用与操作系统和文件系统不同的时钟。因為对文件的更新會默認使用文件所在系统的时钟,这所产生的时钟偏差會导致文件产生的时間戳“早于“或“晚于“程序的时間。
系统更新文件时期望的时間 t (这是當前的时間,或者是通过 touch 命令指定的时間),有很多原因會导致文件的时間戳与期望的时間戳 t 不一致。第一, t 比所能支持的时間有更高的分辨率。第二,文件系统取时間时使用了不同的分辨率。第三,文件系统使用的时間戳与操作系统使用的时間戳使用不同的分辨率。第四,用于更新时間戳的操作系统取时間使用了不同的分辨率。例如,理论上,一个文件系统可使用 10 微秒的分辨率来取得文件的时間戳和使用 100 纳秒的分辨率来取得文件的时间戳,操作系统可能會使用纳秒分辨率取得當前的时間,也可能使使微秒分辨率取得當前的时間。这时使用 touch 指定时間將會取得一个不确定值。
標準的 POSIX 文件有三個时間戳:文件最后一次读取的时間戳 (以下简称:atime) ,文件最后一次修改的时間戳 (以下简称:mtime) ,最后一次变更文件元信息状态的时間戳 (以下简称:ctime) 。有些文件系统可以支持第四個时間戳:創建文件时的时間戳 (以下简称:birthtime) ,根据其定义,这一個时間永远不会变。
ctime 变更常见的一個例子是更改文件的权限。更改文件的权限时不會访问文件,所以 atime 是不會改变的,也不修改文件,因此 mtime 也不會改变。然而,文件本身的一些东西却已经改变了,这一點在某些地方必须得注意。这也便是 ctime 的工作机制。这一點是非常必要的。例如,备份程序生成的文件副本包括了新的权限。另一个更改 ctime 而不影响其它的操作是对文件重命名。
当您閱读、编写或变更文件的属性时,文件的 atime, mtime, 和 ctime 將會被設置為當前的系统时間。and searching a directory counts as reading it. 一個文件的 atime 和 mtime 也可以通过 touch 命令来設置 (參閱 touch invocation)。在实践中,时間戳并不以这种方式来更新。
出于对效率的考虑,很多系统都“懒“得更新 atimes :當程序访問一个文件时,它们可能會延时更新文件的 atimes ,或者文件在最近有访问过就不更新 atimes ,又或者就不更新 atimes 。类似地这种“懒”也适用于 mtimes 和 ctimes , 虽然有时并不會那么地极端。
有些系统會虚拟一個时間戳,而不是能直接支持生成这些时間戳,而这些虚拟的时間戳就可能与这里所说的时間戳不一致。例如,一个系统可以通用使用 mtime 来虚拟一个 atime 或 ctime。
“當前“的时間取决于使用的平台。带有网络文件系统的平台通常会使用与操作系统和文件系统不同的时钟。因為对文件的更新會默認使用文件所在系统的时钟,这所产生的时钟偏差會导致文件产生的时間戳“早于“或“晚于“程序的时間。
系统更新文件时期望的时間 t (这是當前的时間,或者是通过 touch 命令指定的时間),有很多原因會导致文件的时間戳与期望的时間戳 t 不一致。第一, t 比所能支持的时間有更高的分辨率。第二,文件系统取时間时使用了不同的分辨率。第三,文件系统使用的时間戳与操作系统使用的时間戳使用不同的分辨率。第四,用于更新时間戳的操作系统取时間使用了不同的分辨率。例如,理论上,一个文件系统可使用 10 微秒的分辨率来取得文件的时間戳和使用 100 纳秒的分辨率来取得文件的时间戳,操作系统可能會使用纳秒分辨率取得當前的时間,也可能使使微秒分辨率取得當前的时間。这时使用 touch 指定时間將會取得一个不确定值。