在tv_nsec字段中,timespec可以有超过1秒的纳秒值吗?

时间:2013-06-14 17:47:19

标签: c linux time

我正在使用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秒的纳秒数吗?

2 个答案:

答案 0 :(得分:13)

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

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

无论是将其设置为小于0,还是大于或等于10亿,都会导致问题取决于您使用它做什么。如果您只想打印它,或对其执行一些计算,任何有效的LONG_MAX值都应该没问题 - 但如果您将它们标准化,则存储的值可能更有用。

long应始终为您提供0 {999999999范围内的clock_gettime()值。

POSIX要求tv_nsecclock_settime()clock_nanosleep()函数失败,并将nanosleep()设置为errno,如果“ tp < / em>参数指定小于零或大于或等于1000万的纳秒值。“

参考文献:

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

答案 1 :(得分:1)

tv_nsec字段将容忍有限量的纳秒溢出(总是足以添加两个有效的timespec纳秒值,因此,999999999 + 999999999 = 1999999998)。但是,无法保证任意数量的溢出都能正常工作:在具有32位long的实现中,您只能达到超过两秒的纳秒,达到2.147483647秒。所以,如果有人告诉你加上2500毫秒(2.5秒),那就会溢出。

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