【问题标题】:How to correctly convert timespec to timeval?如何正确地将 timespec 转换为 timeval?
【发布时间】:2018-07-19 11:10:01
【问题描述】:

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

现在 lutimes 中的 EINVAL 表示 usec 组件在 0 <= tv_usec < 1000000 之外,这意味着从 timespec 的转换出错了。 [source]

如何正确地将timespec 转换为timeval


使用touch 命令进行更彻底的调试,发现timespec 包含tv_sec = 0tv_nsec > 1000000000,但未指定具体日期且应使用当前时间。

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

【问题讨论】:

  • 此代码无法编译。 lutimes 函数将 array of two timevals 作为第二个参数。您应该发布您的实际代码。
  • @michalsrb 我知道,如果你真的想尝试这个,只需给它两次相同的 timeval(这应该将访问时间和修改时间设置为相同的值)。我应该更改我的示例代码吗?
  • 最好显示给你 EINVAL 错误的实际代码。
  • @michalsrb 当然,它在gitlab.com/Cobra_Fast/maidfs/blob/…,我已经设法解决了:gitlab.com/Cobra_Fast/maidfs/blob/…,但我仍然想知道如何正确地做到这一点。

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


【解决方案1】:

首先我要澄清一下我最初从问题中不清楚的地方:这是 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

【讨论】:

  • 优质的东西,非常感谢。这两个常数不知何故超越了我。
猜你喜欢
  • 2015-09-25
  • 2015-03-22
  • 1970-01-01
  • 2019-12-02
  • 2021-11-21
  • 2018-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多