你如何在 timespec 结构中表达 -1 纳秒?

How do you express -1 nanosecond in a timespec structure?

timespec 结构定义为:

struct timespec {
    time_t tv_sec;        /* seconds */
    long   tv_nsec;       /* nanoseconds [0 .. 999999999] */
};

这两个字段是带符号的数字。我可以轻松地将“现在”定义为:

timespec now{ 1'629'659'718, 564'223'121 };

我也可以定义一个null timespec:

timespec nulltime = {};

但是从结构上看,我们似乎不能真正表达一个负数。对吗?

纳秒字段必须是 0 到 999'999'999 之间的正数(如上所示和各种手册页中提到的,如果此值超出这些范围,函数将 return EINVAL ).

所以我能想到的唯一解决办法就是在tv_sec中使用负数。但是,在那种情况下,我看不到如何表示 -0.000000001(-1 纳秒)...因为我需要至少放置 -1 秒:

timespec minus_one_nano{ -1, 1 };            // this sounds like -1.000000001
timespec minus_one_nano{ -1, 999'999'999 };  // this is probably -1.999999999

有没有这样的东西,或者是否预期 timespec 中的所有数字都是正数?


我的{ -1, 999'999'999 }从哪里来的?

假设我从 1.3 秒开始:

timespec a{ 1, 300'000'000 };

我想减去 1 纳秒,我这样做:

timespec b{ a.tv_sec, a.tv_sec - 1}; // b = {1, 299'999'999}

当我以 0 纳秒开始时:

timespec a{ 3, 0 };   // 3.0s
timespec b{ 2, 999'999'999 };   // a - 1ns = 2.99999999s

将相同的数学应用于 0.0s 我得到:

timespec b{ -1, 999'999'999 };  // zero - 1ns

所以数学适用于这样的负数,但要显示该数字,我必须以某种方式计算相反的数字(即执行 0 - b 然后打印“-”+正数b)。感觉很绕。

你实际上不能在任何system/library调用中使用负时间,所以如果你只是想要一个负时间的概念(例如,你可以添加到绝对时间或间隔以获得正时间),您可以使用您喜欢的任何表示 - 仅 tv_sec 字段(可能)为负并且 tv_nsec 始终为 mod 1e9 可以。