gpt4 book ai didi

linux - CLOCK_MONOTONIC 的起点

转载 作者:IT王子 更新时间:2023-10-29 00:22:07 26 4
gpt4 key购买 nike

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

在 linux 系统上使用 api 调用我可以从哪里获得这个时间?

最佳答案

假设 Linux 内核在开始跟踪单调时钟的同时启动 uptime 计数器,您可以通过减去 uptime 得出启动时间(相对于纪元) 来自当前时间

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 机器从任意返回当前单调时间 - - 但一致 - 时间点(通常是纪元)。


附带说明一下,您可能不需要像我一样推导启动时间。我怀疑有一种方法可以通过 Linux API 获取启动时间,因为有许多 Linux 实用程序以人类可读的格式显示启动时间。例如:

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

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

对于 who 实用程序,我怀疑它利用了 utmp获取系统启动时间的文件。

关于linux - CLOCK_MONOTONIC 的起点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14726401/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com