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 的访问和修改时间,分别设置为 timesactimemodtime 字段。

如果 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_OVERRIDECAP_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)

引用自

capabilities(7), explain(1), explain(3), explain_utime(3), explain_utime_or_die(3), file(1), indent(1), libmagic(3), localtime(3), mount(8), perlfunc(1), perltoc(1), spax(1), tar_extract_regfile(3), time(7)