今天发现项目中调用 clock_gettime 函数传入时钟类型参数时有 CLOCK_MONOTONIC、CLOCK_MONOTONIC_RAW、CLOCK_BOOTTIME、CLOCK_REALTIME 几种,对这几种时钟类型的区别有些疑惑,于是查阅了函数的说明文档,编写代码测试,以加深对clock_gettime 函数的理解

测试代码

#include <time.h>
#include<iostream>
using namespace std; void mono_time_test()
{
struct timespec sp;
clock_gettime(CLOCK_MONOTONIC, &sp);
std::cout << "mono_time...sec:" << sp.tv_sec << std::endl;
} void real_time_test()
{
struct timespec sp;
clock_gettime(CLOCK_REALTIME, &sp);
std::cout << "real_time...sec:" << sp.tv_sec << std::endl; }
void boot_time_test()
{
struct timespec sp;
clock_gettime(CLOCK_BOOTTIME, &sp);
std::cout <<"boot_time..sec:" << sp.tv_sec << std::endl;
} void mono_raw_time_test()
{
struct timespec sp;
clock_gettime(CLOCK_MONOTONIC_RAW, &sp);
std::cout << "mono_raw_time...sec:" << sp.tv_sec << std::endl;
} int main(int argc, char* argv[])
{
mono_time_test();
mono_raw_time_test();
boot_time_test();
real_time_test(); return 1;
}
  • 使用以下命令编译代码,生成测试程序
[wl@ecs-centos-7 my]$ g++ -o main main.cpp
[wl@ecs-centos-7 my]$ ll
total 16
-rwxrwxr-x 1 wl wl 9264 Apr 10 23:30 main
-rw-rw-r-- 1 wl wl 848 Apr 10 23:23 main.cpp

机器时间测试

  • 修改机器时间前,执行测试程序,输出如下结果
[wl@ecs-centos-7 my]$ ./main
mono_time...sec:71
mono_raw_time...sec:71
boot_time..sec:71
real_time...sec:1586532575
[wl@ecs-centos-7 my]$ date -d "1970-01-01 UTC 1586532575 seconds" "+%F %T"
2020-04-10 23:29:35
  • 执行以下命令,修改机器时间
[root@ecs-centos-7 my]$ date -s "2020-04-11 23:30:08"
  • 机器时间修改完成,执行测试程序,输出如下结果
[root@ecs-centos-7 my]# date
Sat Apr 11 23:30:01 CST 2020
[wl@ecs-centos-7 my]$ ./main
mono_time...sec:178
mono_raw_time...sec:178
boot_time..sec:178
real_time...sec:1586619008
[wl@ecs-centos-7 ~]$ date -d "1970-01-01 UTC 1586619008 seconds" "+%F %T"
2020-04-11 23:30:08

测试结果

  • CLOCK_MONOTONIC、CLOCK_MONOTONIC_RAW、CLOCK_BOOTTIME 都不随物理机器时间改变而改变

  • CLOCK_REALTIME 是随物理机器时间改变而改变的

系统休眠测试

下面测试系统休眠对几种时钟的影响,为了对比休眠测试的结果,休眠前后都需要执行一次测试程序

  • 休眠前,执行测试程序,下面是输出结果
[wl@ecs-centos-7 my]$ ./main
mono_time...sec:45
mono_raw_time...sec:45
boot_time..sec:45
real_time...sec:1586535342
  • 执行以下命令,使系统进入休眠

注意:systemctl suspend 命令需要慎重,为避免执行后无法唤醒系统,建议先确保机器可以唤醒休眠。我是通过云服管理后台唤醒系统的

[wl@ecs-centos-7 my]$ systemctl suspend
==== AUTHENTICATING FOR org.freedesktop.login1.suspend ===
Authentication is required for suspending the system.
Authenticating as: root
Password:
==== AUTHENTICATION COMPLETE ===
  • 唤醒系统,执行测试程序,下面是输出结果
[wl@ecs-centos-7 my]$ ./main
mono_time...sec:237
mono_raw_time...sec:237
boot_time..sec:367
real_time...sec:1586535664

测试结果

  • CLOCK_MONOTONIC、CLOCK_MONOTONIC_RAW 不包含系统休眠期间的时间

  • CLOCK_BOOTTIME、CLOCK_REALTIME 包含系统休眠期间的时间

物理机器重启测试

  • 重启机器之前,执行测试程序,下面是输出结果
[wl@ecs-centos-7 my]$ ./main
mono_time...sec:2510
mono_raw_time...sec:2510
boot_time..sec:2640
real_time...sec:1586537938
  • 执行以下命令重启机器
[wl@ecs-centos-7 my]$ reboot
==== AUTHENTICATING FOR org.freedesktop.login1.reboot ===
Authentication is required for rebooting the system.
Authenticating as: root
Password:
==== AUTHENTICATION COMPLETE ===
  • 重启完成,执行测试程序,下面是输出结果
[wl@ecs-centos-7 my]$ ./main
mono_time...sec:41
mono_raw_time...sec:41
boot_time..sec:41
real_time...sec:1586537997

测试结果

  • 重启物理机器对 CLOCK_REALTIME 没有任何影响
  • 重启物理机器后, CLOCK_MONOTONIC、CLOCK_MONOTONIC_RAW、CLOCK_BOOTTIME 时间全部重新计数

参考

https://linux.die.net/man/2/clock_gettime

Linux不同时钟的区别的更多相关文章

  1. linux系统时钟和硬件时钟不一致

    在做DB2 集群复制的时候要求两台主机时间相互一致. 但是在一台主机上系统时间和硬件时间相差12个小时左右:手动同步后,重启后又相差12个小时左右. 为什么会是这样的,先介绍下系统时钟和硬件时钟的区别 ...

  2. linux 实时时钟(RTC)驱动【转】

    转自:http://blog.csdn.net/yaozhenguo2006/article/details/6820218 这个是linux内核文档关于rtc实时时钟部分的说明,此文档主要描述了rt ...

  3. Linux 系统时钟(date) 硬件时钟(hwclock)

    /********************************************************************* * Linux 系统时钟(date) 硬件时钟(hwclo ...

  4. linux 通用时钟框架CCF

    linux CCF 时钟框架 简单介绍 这里讲的时钟是给soc各组件提供时钟的树状框架,并非内核使用的时间,和其它模块一样,clk也有框架,用以适配不同的平台.适配层之上是客户代码和接口,也就是各模块 ...

  5. linux 和unix 的区别

    Linux与Unix的区别  某些PC机的Unix和Linux在实现方面相类似.几乎所有的商业Unix版本都基本支持同样的软件.程序设计环境和网络特性.然而,Linux和Unix的商业版本依然存在许多 ...

  6. Linux系统时钟的更改

    linux系统时钟有两个,一个是硬件时钟,即BIOS时间,就是我们进行CMOS设置时看到的时间,另一个是系统时钟,是linux系统Kernel时间. 查看.设置硬件时间: 查看系统硬件时钟 hwclo ...

  7. Linux的优缺点,Linux与windows的区别

    Linux 一. 什么是linux? Linux是一套免费使用和自由传播的类Unix操作系统,是一个多用户.多任务.支持多线程和多CPU的操作系统.它能运行主要的UNIX工具软件.应用程序和网络协议. ...

  8. php windows与linux下的路径区别

    php windows与linux下的路径区别windows用的是"\",linux用的是"/"这一点要特别清楚,, ps:在PHP windows也可以用/表 ...

  9. Linux系统 关机/重启/用户切换/注销,用户管理(用户创建/修改,用户组增加/删除),Linux中 / 和 ~ 的区别

    1.关机/重启命令 shutdown命令 shutdown -h now :立即关机 shutdown -h 1 :1分钟后关机 shutdown -r now :立即重启 shutdown -r 1 ...

随机推荐

  1. H5页面,输入框的光标,如果页面上下滑动光标停留在页面上,除了输入框外,松手过了一段时间才跑回输入框里面

    有点类似这种情况 其中一个博主描述得比较详细,主要还有图 我是直接在App.vue主文件那里添加一下代码,主要是添加一个监听器,如果touchmove的时候就会触发让其失焦,就会消失那个光标,需要再次 ...

  2. MySQL 【教程二】

    MySQL 创建数据表 创建MySQL数据表需要以下信息: 表名 表字段名 定义每个表字段 语法 以下为创建MySQL数据表的SQL通用语法: # CREATE TABLE table_name (c ...

  3. 在vscode中怎样debug调试go程序

    随着互联网时代的飞速发展,我们编码使用的开发利器也在不断更新换代,古话说工欲善其事必先利其器,对于Java开发者而言,eclipse和idea这两款神器各有千秋,因自己的爱好可以选取不同的IDE,但是 ...

  4. Python3学习之路~9.4 队列、生产者消费者模型

    一 队列queue 当必须在多个线程之间安全地交换信息时,队列在线程编程中特别有用. 队列的作用:1.解耦,使程序直接实现松耦合 2.提高处理效率 列表与队列都是有顺序的,但是他们之间有一个很大的区别 ...

  5. JavaScript 模式》读书笔记(3)— 字面量和构造函数2

    上一篇啊,我们聊了聊字面量对象和自定义构造函数.这一篇,我们继续,来聊聊new和数组字面量. 三.强制使用new的模式 要知道,构造函数,只是一个普通的函数,只不过它却是以new的方式调用.如果在调用 ...

  6. 什么是Hibernate

    Hibernate是一个基于JDBC的主流持久性框架,是一个优秀的ORM(object relation mapping)(对象关系映射)实现 ORM就是通过java对象映射到数据库表中,通过操作ja ...

  7. springMVC容器简介和执行流程

    先来看一下,初始化的大体流程:  然后,我们再来看一下,我们的控制器DispatcherServlet的类图及继承关系.  系统启动的时候根据配置文件创建spring的容器, 首先是发送http请求到 ...

  8. JavaScript(9)--- 跨域

    JavaScript(9)--- 跨域 一.跨域原理(同源策略) 在项目搭建的初期,因为现在项目基本上都是前后端分离,所以不可避免地会遇到跨域问题,而造成跨域的罪魁祸首就是浏览器的同源策略.所以要解决 ...

  9. Django-rest-framework源码分析(一)

    一.APIView 入口 在路由层执行as_view()方法 rest-framework/views.py/class APIView/def as_view() 可以看到,APIView继承了Dj ...

  10. 1+1>2:MIT&IBM提出结合符号主义和连接主义的高效、准确新模型

    自人工智能的概念提出以来,关于符号主义和连接主义的争论就不绝于耳.究竟哪一种方式可以实现更好的人工智能?这一问题目前还没有定论.深度学习的快速发展让我们看到连接主义在构建 AI 系统中的优势,但其劣势 ...