utimes() - Unix,Linux系统调用
广告
名称
utime, utimes - 更改inode的访问和/或修改时间
概要
#include <sys/types.h>
#include <utime.h>
int utime(const char *filename, const struct utimbuf *buf);
#include <sys/time.h>
int utimes(const char *filename, const struct timeval times[2]);
|
描述
utime() 分别将filename 指定的inode的访问和修改时间更改为buf 的actime 和modtime 字段。
如果buf 为NULL,则文件的时间戳将设置为当前时间。
在以下情况下允许更改时间戳:进程具有相应的权限(Linux:具有CAP_FOWNER功能),或者有效用户ID等于文件的用户ID,或者buf必须为NULL并且进程对文件具有写权限。
utimbuf 结构为:
struct utimbuf {
time_t actime; /* access time */
time_t modtime; /* modification time */
};
|
utime() 函数允许以1秒的分辨率指定时间戳。utimes() 函数类似,但允许以1微秒的分辨率。这里times[0] 指访问时间,times[1] 指修改时间。 timeval 结构为:
struct timeval {
long tv_sec; /* seconds */
long tv_usec; /* microseconds */
};
|
返回值
成功时,返回零。出错时,返回-1,并适当地设置errno。
错误
标签 | 描述 |
EACCES | 拒绝搜索path路径前缀中的一个目录的权限(另见path_resolution(2)),或者buf为NULL并且进程没有权限更改时间戳(见上文)。 |
ENOENT |
filename不存在。 |
EPERM |
buf不为NULL并且进程没有权限更改时间戳。 |
EROFS |
path位于只读文件系统上。 |
备注
Linux不允许更改不可变文件的时间戳,也不允许将只追加文件的的时间戳设置为当前时间以外的时间。
在libc4和libc5中,utimes()只是utime()的包装器,因此不允许亚秒级分辨率。
POSIX.1-2001将utimes()标记为旧版,这很奇怪,因为它比utime()提供了更多功能。
错误
Linux没有仔细区分EACCES和EPERM错误返回。另一方面,POSIX.1-2001在其对utimes()的错误描述中存在错误。
符合标准
utime(): SVr4, POSIX.1-2001。
utimes(): 4.3BSD
参见
广告
|