utime(2) - Linux 手册页
名称
utime, utimes - 更改文件最后访问和修改时间
概要
#include <sys/types.h> #include <utime.h> int utime(const char *filename, const struct utimbuf *times); #include <sys/time.h> int utimes(const char *filename, const struct timeval times[2]);
描述
utime() 系统调用更改由 filename 指定的 inode 的访问和修改时间,分别设置为 times 的 actime 和 modtime 字段。
如果 times 为 NULL,则文件的访问和修改时间设置为当前时间。
更改时间戳的权限要求如下:进程具有适当的权限,或者有效用户 ID 等于文件的用户 ID,或者 times 为 NULL 并且进程对文件具有写权限。
utimbuf 结构体是
-
struct utimbuf { time_t actime; /* access time */ time_t modtime; /* modification time */ }; - utime() 系统调用允许以 1 秒的精度指定时间戳。
utimes() 系统调用类似,但 times 参数引用的是一个数组而不是一个结构体。该数组的元素是 timeval 结构体,允许以 1 微秒的精度指定时间戳。timeval 结构体是
-
struct timeval { long tv_sec; /* seconds */ long tv_usec; /* microseconds */ }; - times[0] 指定新的访问时间,times[1] 指定新的修改时间。如果 times 为 NULL,则与 utime() 类似,文件的访问和修改时间设置为当前时间。
返回值
成功时返回零。出错时返回 -1,并相应地设置 errno。
错误
- EACCES
对 path 路径前缀中的某个目录的搜索权限被拒绝(请参阅 path_resolution(7))。
EACCES
times 为 NULL,调用者的有效用户 ID 与文件的所有者不匹配,调用者对文件没有写访问权限,并且调用者没有特权(Linux:没有 CAP_DAC_OVERRIDE 或 CAP_FOWNER 功能)。
ENOENT
filename 不存在。
EPERM
times 不为 NULL,调用者的有效 UID 与文件的所有者不匹配,并且调用者没有特权(Linux:没有 CAP_FOWNER 功能)。
EROFS
path 位于只读文件系统上。
符合
utime(): SVr4, POSIX.1-2001. POSIX.1-2008 将 utime() 标记为已弃用。
utimes(): 4.3BSD, POSIX.1-2001。
说明
Linux 不允许更改不可变文件的时间戳,也不允许将只追加文件的的时间戳设置为当前时间以外的值。
在 libc4 和 libc5 中,utimes() 只是 utime() 的包装器,因此不允许亚秒级精度。
参见
chattr(1), futimesat(2), stat(2), utimensat(2), futimens(3), futimes(3)