Difference between CLOCK_REALTIME and CLOCK_MONOTONIC

本文详细介绍了clock_gettime()函数的功能及使用方法,特别是clk_id参数的含义。解释了CLOCK_REALTIME(系统实时时间)、CLOCK_MONOTONIC(启动以来的绝对时间)、CLOCK_PROCESS_CPUTIME_ID(进程CPU时间)和CLOCK_THREAD_CPUTIME_ID(线程CPU时间)。这些信息对于理解和使用系统时间非常关键。

int clock_gettime(clockid_t clk_id,struct timespec *tp);

clk_id参数解释
CLOCK_REALTIME:系统实时时间,随系统实时时间改变而改变,即从UTC1970-1-1 0:0:0开始计时,中间时刻如果系统时间被用户该成其他,则对应的时间相应改变
CLOCK_MONOTONIC:从系统启动这一刻起开始计时,不受系统时间被用户改变的影响
CLOCK_PROCESS_CPUTIME_ID:本进程到当前代码系统CPU花费的时间
CLOCK_THREAD_CPUTIME_ID:本线程到当前代码系统CPU花费的时间


Clock_realtime 代表机器上可以理解为当前的我们所常看的时间,其当time-of-day 被修改的时候而改变,这包括NTP对它的修改(NTP:Network Time Protocol(NTP)是用来使计算机时间同步化的一种协议,它可以使计算机对其服务器或时钟源(如石英钟,GPS等等)做同步化,它可以提供高精准度的时间校正(LAN上与标准间差小于1毫秒,WAN上几十毫秒),且可介由加密确认的方式来防止恶毒的协议攻击。)

CLOCK_MONOTONIC 代表从过去某个固定的时间点开始的绝对的逝去时间,它不受任何系统time-of-day时钟修改的影响,如果想计算出在一台计算机上不受重启的影响,两个事件发生的间隔时间的话,那么它将是最好的选择。
### CLOCK_REALTIMECLOCK_MONOTONIC 的区别 `CLOCK_REALTIME` 和 `CLOCK_MONOTONIC` 是 Linux 系统中两种常用的时钟类型,它们在行为和用途上有显著区别。 #### `CLOCK_REALTIME` `CLOCK_REALTIME` 表示系统范围内的实时时钟(wall time),它反映的是从 Epoch(1970-01-01 00:00:00 UTC)到当前的时间。这种时钟可以被系统管理员手动调整,也可以被 NTP(网络时间协议)自动调整,因此其值可能会向前或向后跳变[^1]。`CLOCK_REALTIME` 适用于需要与外部时间源同步的场景,例如日志记录、定时任务等。 ```c #include <time.h> struct timespec ts; clock_gettime(CLOCK_REALTIME, &ts); ``` #### `CLOCK_MONOTONIC` `CLOCK_MONOTONIC` 表示单调递增的时间,它从系统启动开始计算,不受系统时间调整的影响。即使系统时间被修改,`CLOCK_MONOTONIC` 的值也不会发生变化。这种特性使其非常适合用于测量时间间隔,例如计算程序执行时间或处理事件之间的时间差[^4]。`CLOCK_MONOTONIC` 的值通常以系统启动时间为起点,随着时间的推移而不断增加,且不会被外部因素干扰[^5]。 ```c #include <time.h> struct timespec ts; clock_gettime(CLOCK_MONOTONIC, &ts); ``` #### 主要区别 1. **时间起点不同**:`CLOCK_REALTIME` 的时间起点是固定的 Epoch 时间,而 `CLOCK_MONOTONIC` 的时间起点是系统启动时。 2. **受系统时间调整影响**:`CLOCK_REALTIME` 可以被系统管理员或 NTP 修改,而 `CLOCK_MONOTONIC` 不受任何系统时间调整的影响[^4]。 3. **用途不同**:`CLOCK_REALTIME` 更适合需要与外部时间源同步的场景,而 `CLOCK_MONOTONIC` 更适合测量时间间隔和避免时间跳变带来的问题[^5]。 #### 示例代码 以下是一个展示 `CLOCK_REALTIME` 和 `CLOCK_MONOTONIC` 差异的示例代码: ```c #include <stdio.h> #include <time.h> int main() { struct timespec realtime, monotonic; clock_gettime(CLOCK_REALTIME, &realtime); clock_gettime(CLOCK_MONOTONIC, &monotonic); printf("CLOCK_REALTIME: %ld seconds, %ld nanoseconds\n", realtime.tv_sec, realtime.tv_nsec); printf("CLOCK_MONOTONIC: %ld seconds, %ld nanoseconds\n", monotonic.tv_sec, monotonic.tv_nsec); return 0; } ``` ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值