CLOCK_MONOTONIC的起始点

据我所知在Linux上CLOCK_MONOTONIC是启动时间。 在我目前的工作中,我更喜欢使用单调时钟而不是CLOCK_REALTIME (用于计算),但同时我需要在报告中提供人性化的时间戳(年/月/日)。 他们可能不是很精确,所以我打算在开机时join单调计数器。

从哪里可以得到这个时间在Linux系统上使用API​​调用?

Solutions Collecting From Web of "CLOCK_MONOTONIC的起始点"

假设Linux内核在开始跟踪单调时钟的同时启动正运行时间计数器,则可以通过从当前时间减去正常运行时间来得出启动时间(相对于Epoch)。

Linux通过sysinfo结构在几秒钟内提供系统正常运行时间 ; 自Epoch以来的当前时间可以通过time函数在POSIX兼容库上获取。

 #include <stddef.h> #include <stdio.h> #include <time.h> #include <sys/sysinfo.h> int main(void){ /* get uptime in seconds */ struct sysinfo info; sysinfo(&info); /* calculate boot time in seconds since the Epoch */ const time_t boottime = time(NULL) - info.uptime; /* get monotonic clock time */ struct timespec monotime; clock_gettime(CLOCK_MONOTONIC, &monotime); /* calculate current time in seconds since the Epoch */ time_t curtime = boottime + monotime.tv_sec; /* get realtime clock time for comparison */ struct timespec realtime; clock_gettime(CLOCK_REALTIME, &realtime); printf("Boot time = %s", ctime(&boottime)); printf("Current time = %s", ctime(&curtime)); printf("Real Time = %s", ctime(&realtime.tv_sec)); return 0; } 

不幸的是,单调时钟相对于启动时间可能不匹配。 当我在我的机器上测试上面的代码时,单调时钟是系统正常运行时间的第二个时间。 但是,只要考虑相应的偏移量,您仍然可以使用单调时钟。

可移植性注意 :虽然Linux可能会返回相对于引导时间的当前单调时间,但POSIX机器通常允许从任意时间点(通常为Epoch)返回当前单调时间。


作为一个方面说明,你可能不需要像我那样得到启动时间。 我怀疑有一种方法可以通过Linux API来获得启动时间,因为有许多Linux实用程序以可读格式显示启动时间。 例如:

 $ who -b system boot 2013-06-21 12:56 

我无法找到这样的调用,但是检查这些常用实用程序的源代码可能会揭示它们如何确定人类可读启动时间。

who实用程序的情况下,我怀疑它使用utmp文件来获取系统启动时间。

http://www.kernel.org/doc/man-pages/online/pages/man2/clock_getres.2.html

  CLOCK_MONOTONIC Clock that cannot be set and represents monotonic time since some unspecified starting point. 

意思是你可以使用CLOCK_MONOTONIC进行间隔计算和其他的事情,但是你不能真正把它转换成人类可读的表示。

而且,你可能希望CLOCK_MONOTONIC_RAW而不是CLOCK_MONOTONIC

  CLOCK_MONOTONIC_RAW (since Linux 2.6.28; Linux-specific) Similar to CLOCK_MONOTONIC, but provides access to a raw hard‐ ware-based time that is not subject to NTP adjustments. 

继续使用CLOCK_REALTIME进行人类可读的时间。

CLOCK_MONOTONIC通常不受系统时间调整的影响。 例如,如果通过NTP调整系统时钟,则CLOCK_MONOTONIC无法知道(也不需要)。

出于这个原因,如果您需要可读的时间戳,请不要使用CLOCK_MONOTONIC

请参阅CLOCK_REALTIME和CLOCK_MONOTONIC之间的区别? 讨论。