gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 01:37:21 24 4
gpt4 key购买 nike

我有一个 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 = 0tv_nsec > 1000000000 ,当未指定具体日期时应使用当前时间。

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

最佳答案

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

我的猜测是它是两个特殊值之一:UTIME_NOWUTIME_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

关于c++ - 如何正确地将 timespec 转换为 timeval?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48692979/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com