有没有一种标准的方法将结构体 timeval 转换为结构体 timespec?

15

struct timeval代表一个时间点,它有两个成员:tv_sec(秒)和tv_usec(微秒)。在这种表示中,tv_usec本身不是绝对时间,而是相对于tv_sec的亚秒偏移量。

struct timespec的工作方式与之相同,但是它的偏移值(tv_nsec)以纳秒为单位存储。

问题是: 是否有一种标准的方法可以在这两者之间进行转换?

2个回答

18

在Linux上,您可能需要在#include <sys/time.h>之前定义_GNU_SOURCE,以便获取这些宏。 - Craig McQueen
请注意,TIMESPEC_TO_TIMEVAL截断了tv_nsec值,这可能不是您想要的。也就是说,您可能更喜欢四舍五入。例如,如果将timeval传递给setitimer(),则需要这样做,因为如果timespec被截断为零,则计时器将被清除而不是设置为最小值(微秒)。 - pixelbeat

17

看这个文档,我认为将tv_usec乘以1000足以得到tv_nsec

更重要的是,我怀疑不同结构体的来源可能来自于不同的时钟。


由于tv_nsec是一个亚秒偏移量,如果乘以1000的结果大于10亿,那么怎么办?难道不需要将tv_sec加1,然后将tv_nsec设置为超过10亿的数量吗? - dicroce
9
不行,因为 tv_usec 表示微秒偏移量,保证小于1000000,所以将其乘以1000得到的值小于10亿。 - JaakkoK
1
如果你想从timespec转换为timeval,你需要将 tv_nsec 除以1000得到 tv_usec(可能先加上500,以四舍五入)。 - user862787

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接