函數: int clock_gettime(clockid_t clk_id, struct timespec *tp);
clockid_t: 用於指定計時時鐘的類型,有以下幾種類型:
CLOCK_REALTIME: 系統實時時間,從Epoch計時,可被設置更改。
CLOCK_MONOTONIC: 系統運行時間,從系統啓動時開始計時,系統休眠時不再計時(NTP與硬件時鐘有問題時會影響其頻率,沒有驗證過)。
CLOCK_PROCESS_CPUTIME_ID: 本進程啓動到此刻使用CPU的時間,當使用sleep等函數時不再計時。
CLOCK_THREAD_CPUTIME_ID: 本線程啓動到此刻使用CPU的時間,當使用sleep等函數時不再計時。
CLOCK_MONOTONIC_RAW : 系統運行時間,從系統啓動時開始計時,系統休眠時不再計時(NTP與硬件時鐘有問題時不會影響其頻率,沒有驗證過)。
CLOCK_REALTIME_COARSE: 系統實時時間,從Epoch計時,可被設置更改,速度更快精度更低。
CLOCK_MONOTONIC_COARSE: 系統運行時間,從系統啓動時開始計時,速度更快精度更低,系統休眠時不再計時(NTP與硬件時鐘有問題時會影響其頻率,沒有驗證過)。
CLOCK_BOOTTIME: 與CLOCK_MONOTONIC類似
CLOCK_REALTIME_ALARM : 鬧鐘時間(應該休眠後繼續計時,沒驗證過),系統實時時間,從Epoch計時,可被設置更改。
CLOCK_BOOTTIME_ALARM: 鬧鐘時間(應該休眠後繼續計時,沒驗證過),系統運行時間,從系統啓動時開始計時。
CLOCK_TAI: 原子鐘的時間,與CLOCK_REALTIME類似,不可被更改,沒有閏秒。
struct timespec:
struct timespec
{
time_t tv_sec; //秒
long tv_nsec; //納秒
};
在Linux內核中,我們可以發現主要有這麼幾種不同類型的時鐘(clock):
1 2 3 4 |
|
CLOCK_REALTIME,可以理解爲wall time,即是實際的時間。用戶可以使用命令(date)或是系統調用去修改。如果使用了NTP, 也會被NTP修改。當系統休眠(suspend)時,仍然會運行的(系統恢復時,kernel去作補償)。
CLOCK_MONTONIC,是單調時間,即從某個時間點開始到現在過去的時間。用戶不能修改這個時間,但是當系統進入休眠(suspend)時,CLOCK_MONOTONIC是不會增加的。
CLOCK_MONOTONIC_RAW,和CLOCK_MONOTONIC類似,但不同之處是MONOTONIC_RAW不會受到NTP的影響。CLOCK_MONOTONIC會受到NTP的影響並不是說NTP會去修改CLOCK_MONOTONIC,使其不連續,而是說當NTP server 和本地的時鐘硬件之間有問題,NTP會影響到CLOCK_MONOTONIC的頻率,但是MONOTONIC_RAW則不會受其影響。 其區別可以參考 Difference between MONOTONIC and MONOTONIC_RAW
CLOCK_BOOTTIME,與CLOCK_MONOTONIC類似,但是當suspend時,會依然增加。可以參考LWN的這篇文章 introduce CLOCK_BOOTTIME
---------------------
轉自:https://blog.csdn.net/lang523493505/article/details/90043636