我有一个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的lutimes意味着usec组件在0 <= tv_usec < 1000000之外,这意味着来自timespec的转换出错了。[来源]
如何正确地将timespec转换为timeval
使用touch命令进行更彻底的调试,会发现timespec包含tv_sec = 0和tv_nsec > 1000000000,此时没有指定特定日期,应该使用当前时间。
为什么会这样呢?处理这件事的正确方法是什么?
发布于 2018-02-08 20:36:37
首先,我将从问题中澄清我不清楚的是什么:这是fuse文件系统中utimens操作的实现,问题是有时tv_nsec字段的值大于或等于1,000,000,000。
我猜想它是两个特殊值之一:UTIME_NOW或UTIME_OMIT。
fuse文档指向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
https://stackoverflow.com/questions/48692979
复制相似问题