10

我正在使用该clock_gettime()命令并尝试将给定的毫秒数附加到timespec我从中获得的毫秒数上。我可以这样做吗?

//milli is an int that can be any number (within reason)
struct timespec ts;
clock_gettime(CLOCK_REALTIME, &ts);
ts.tv_nesc += (milli*1000000);

还是我需要先拆分它并找出是否有整秒,将它们添加到tv_sec字段中,然后将剩余的添加到tv_nsec

本质上,该tv_nsec字段可以存储超过 1 秒的纳秒吗?

4

2 回答 2

14

这完全取决于你要用它做什么。

a的tv_nsec成员属于struct timespec类型longLONG_MIN您可以将其设置为范围内您喜欢的任何值LONG_MAX。如果您执行的计算超过LONG_MAX,即至少为 2 31 -1,那么您将遇到问题(未定义的行为可能会显示为值环绕)。

将其设置为小于 0 或大于或等于 10 亿的值是否会导致问题取决于您如何处理它。如果您只想打印它,或对其执行一些计算,任何有效值long都应该没问题——但如果您对它们进行标准化,存储的值可能会更有用。

clock_gettime()应始终为您提供tv_nsec0..999999999 范围内的值。

如果“ tp参数指定的纳秒值小于零或大于或等于 10 亿” ,则POSIX 要求clock_settime()clock_nanosleep()nanosleep()函数失败并设置errno为。EINVAL

参考:

http://pubs.opengroup.org/onlinepubs/9699919799/functions/clock_settime.html http://pubs.opengroup.org/onlinepubs/9699919799/functions/clock_nanosleep.html http://pubs.opengroup.org/onlinepubs/ 9699919799/functions/nanosleep.html

于 2013-06-14T18:40:15.220 回答
1

一个tv_nsec字段将容忍有限数量的纳秒溢出(总是足以添加两个有效的 timespec 纳秒值,因此,999999999 + 999999999 = 1999999998)。但是,不能保证任意数量的溢出都会起作用:在使用 32-bit 的实现上long,您最多只能达到两秒多的纳秒,达到 2.147483647 秒。因此,如果有人告诉您添加 2500 毫秒(2.5 秒),那将会溢出。

编辑以添加:并且,正如 Keith Thompson 指出的那样,您需要在将一个 timespec 添加到另一个 timespec 后重新规范化。

于 2013-06-14T18:39:40.760 回答