如何正确地将timespec转换为timeval?

时间:2018-02-08 19:04:22

标签: c++ data-conversion fuse timeval timespec

我有一个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

来自EINVAL的{​​{1}}表示usec组件不在lutimes之内,这意味着0 <= tv_usec < 1000000的转换出错了。 [source]

如何正确地从timespec转换为timespec

使用timeval命令进行更彻底的调试,显示touch包含timespectv_sec = 0,但未指定具体日期且应使用当前时间。< / p>

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

1 个答案:

答案 0 :(得分:2)

首先,我首先澄清一下我不清楚的问题:这是在fuse文件系统中执行utimens操作,问题是有时候tv_nsec字段有值大于或等于1,000,000,000。

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

保险丝文档指向utimensat手册页,其中包含对这些特殊值的说明: http://man7.org/linux/man-pages/man2/utimensat.2.html

同时检查linux内核中的nsec_valid函数:

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