代码之家  ›  专栏  ›  技术社区  ›  Cobra_Fast

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

  •  0
  • Cobra_Fast  · 技术社区  · 6 年前

    我有一个 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 出了问题。 [source]

    如何正确转换 timespec公司 timeval ?


    使用进行更彻底的调试 touch 命令,显示 timespec公司 包含 tv_sec = 0 tv_nsec > 1000000000 ,如果未指定具体日期,则应使用当前时间。

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

    1 回复  |  直到 6 年前
        1
  •  2
  •   michalsrb    6 年前

    首先,我将澄清我一开始不清楚的问题:这是 utimens fuse文件系统中的操作,问题是有时 tv_nsec 字段的值大于或等于100000000。

    我猜这是两个特殊值之一: UTIME_NOW UTIME_OMIT .

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


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

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

    推荐文章