0

我有一个struct timespec对象需要转换为struct timeval用于lutimes(...).

我尝试了以下操作,但lutimes()抱怨。

const struct timespec ts; // originally provided as function parameter from FUSE
struct timeval tv;
tv.tv_sec = ts.tv_sec;
tv.tv_usec = ts.tv_nsec / 1000;
lutimes(path, tv); // returns -1; errno=EINVAL

现在EINVALfromlutimes表示 usec 组件在 之外0 <= tv_usec < 1000000,这意味着转换 fromtimespec出错了。[资源]

我如何正确转换timespectimeval


使用该命令进行更彻底的调试会touch显示timespec包含tv_sec = 0and tv_nsec > 1000000000,当没有指定特定日期并且应该使用当前时间时。

为什么是这样?处理这个问题的正确方法是什么?

4

1 回答 1

2

首先,我将从问题中首先澄清我不清楚的地方:这是utimensfuse 文件系统中操作的实现,问题是有时该tv_nsec字段的值大于或等于 1,000,000,000。

我的猜测是它是两个特殊值之一:UTIME_NOWor UTIME_OMIT

fuse 文档指向utimensat手册页,其中解释了这些特殊值: http: //man7.org/linux/man-pages/man2/utimensat.2.html


还要检查nsec_validlinux内核中的函数:

https://elixir.free-electrons.com/linux/v4.15.2/source/fs/utimes.c#L40

于 2018-02-08T20:36:37.873 回答