我有一个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
包含timespec
和tv_sec = 0
,但未指定具体日期且应使用当前时间。< / p>
这是为什么?处理这个问题的正确方法是什么?
答案 0 :(得分:2)
首先,我首先澄清一下我不清楚的问题:这是在fuse文件系统中执行utimens
操作,问题是有时候tv_nsec
字段有值大于或等于1,000,000,000。
我的猜测是它是两个特殊值之一:UTIME_NOW
或UTIME_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