对于某些第三方库函数,它要求我传递timespec
使用绝对时间而不是相对时间。
要做到这一点,我有:
struct timespec ts;
struct timespec now;
if (clock_gettime(CLOCK_REALTIME, &now) != 0)
{
printf("Error: ");
printf("%s\n", strerror(errno));
}
tspec_add(&ts, &now, 5000); //ts = now + 5000ms.
//I pass ts to the library function.
功能正常。但是,如果我使用CLOCK_MONOTONIC
或CLOCK_MONOTONIC_RAW
则无效。
我检查了错误(没有发生)。功能成功但输出的时间完全不同而且非常小。它为tv.sec
打印了9005,但在使用CLOCK_REALTIME
时,它打印了一个巨大的数字(我假设时间以来的时间)。
这是为什么?我怎样才能使用单调时钟来做同样的事情?
答案 0 :(得分:4)
正如@IwillnotexistIdonotexist暗示的那样,CLOCK_MONOTONIC没有指定的起点,你无法将单调时间可靠地转换为实时。
引用clock_gettime manpage,获取CLOCK_MONOTONIC:
无法设置的时钟,表示一些时间以来的单调时间 未指明的起点
唯一的限制是MONOTONIC时间必须大于系统的正常运行时间(为了单调增加所需)。
我希望大多数实现确实只是启动后的时钟滴答,但没有任何保证。