Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 时钟的起点是单调的_Linux_Real Time - Fatal编程技术网

Linux 时钟的起点是单调的

Linux 时钟的起点是单调的,linux,real-time,Linux,Real Time,正如我在Linux上理解的那样,时钟的起点是启动时间。在我目前的工作中,我更喜欢使用单调时钟,而不是clock\u REALTIME(用于计算),但同时我需要在报告中提供人性化的时间戳(带有年/月/日)。它们可能不是很精确,所以我想加入单调计数器和引导时间 这次在linux系统上使用api调用从何处获得 时钟单调通常不受系统时间调整的影响。例如,如果通过NTP调整系统时钟,clock_monotic无法知道(也不需要知道) 因此,如果您需要人类可读的时间戳,请不要使用CLOCK\u monoti

正如我在Linux上理解的那样,
时钟的起点是启动时间。在我目前的工作中,我更喜欢使用单调时钟,而不是
clock\u REALTIME
(用于计算),但同时我需要在报告中提供人性化的时间戳(带有年/月/日)。它们可能不是很精确,所以我想加入单调计数器和引导时间


这次在linux系统上使用api调用从何处获得

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

因此,如果您需要人类可读的时间戳,请不要使用
CLOCK\u monotic

有关讨论,请参阅。

这意味着您可以使用
CLOCK\u MONOTONIC
进行间隔计算和其他操作,但实际上无法将其转换为人类可读的表示形式

此外,您可能需要
时钟单调的\u原始
而不是
时钟单调的


继续使用
CLOCK\u REALTIME
作为人类可读时间。

假设Linux内核在开始跟踪单调时钟的同时启动正常运行时间计数器,您可以通过从当前时间中减去正常运行时间来推导引导时间(相对于历元)

Linux通过该结构提供了以秒为单位的系统正常运行时间;可以通过函数在兼容POSIX的库中获取自Epoch以来的当前时间(秒)

#包括
#包括
#包括
#包括
内部主(空){
/*在几秒钟内获得正常运行时间*/
结构sysinfo;
sysinfo(&info);
/*以秒为单位计算自纪元起的启动时间*/
const time\u t boottime=时间(NULL)-info.uptime;
/*得到单调的时钟时间*/
struct timespec monotime;
时钟获取时间(时钟单调和单时间);
/*计算自历元起的当前时间(以秒为单位)*/
time\u t curtime=引导时间+monotime.tv\u秒;
/*获取用于比较的实时时钟时间*/
结构timespec实时;
时钟获取时间(时钟实时和实时);
printf(“启动时间=%s”,ctime(&boottime));
printf(“当前时间=%s”,ctime(&curtime));
printf(“实时=%s”,ctime(&realtime.tv_-sec));
返回0;
}
不幸的是,相对于启动时间,单调时钟可能无法精确匹配。当我在我的机器上测试上述代码时,单调的时钟距离系统正常运行时间仅差一秒。但是,只要考虑到各自的偏移量,您仍然可以使用单调时钟

可移植性注意事项:尽管Linux可能返回相对于启动时间的当前单调时间,但POSIX机器通常允许从任意但一致的时间点(通常是纪元)返回当前单调时间


作为补充说明,您可能不需要像我那样导出引导时间。我怀疑有一种方法可以通过LinuxAPI获得引导时间,因为有许多Linux实用程序以人类可读的格式显示引导时间。例如:

$ who -b
         system boot  2013-06-21 12:56
我找不到这样的调用,但是检查一些常见实用程序的源代码可能会发现它们是如何确定人类可读的启动时间的


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

Linux没有正确地
CLOCK\u monotional
。为了解决这个问题,他们添加了
CLOCK\u MONOTONIC\u RAW
。CLOCK\u MONOTONIC是单调的,但可以调整。这是通过倾斜计数器来实现的。为了保持时间,有些滴答声会比其他滴答声花费稍微多/少的时间。是的,我知道单调时钟和实时时钟的区别。我试图将这两种方法结合起来,因为我不想在对象中存储两个时间戳——单调和实时。我想在工作中使用单调,然后以某种方式获得关于开始点的信息,在客户端只需将单调部分添加到其中。答案是:不要去那里。如果必须的话,您可以通过读取两个时钟来估计当前单调到实时的偏移量,但是偏移量可以在没有警告的情况下改变;至少从UNIX v6开始,系统启动时间记录在utmp(/var/run/utmp)中:)
  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.
$ who -b
         system boot  2013-06-21 12:56