1. Linux系統時間
jiffies是linux內核中的一個全局變量,用來記錄以內核的節拍時間為單位時間長度的一個數值。
jiffies變量開機時有一個基準值,然后內核每過一個節拍時間jiffies就會加1。 一個時間節拍的時間取決于操作系統的配置,Linux系統一般是10ms或者1ms。這個時間其實就是調度時間,在內核中用HZ來記錄和表示。如果HZ定義成1000難么時鐘節拍就是1/HZ,也就是1ms。
內核在開機啟動的時候會讀取RTC硬件獲取一個時間作為初始基準時間,這個基準時間對應一個jiffies值(這個基準時間換算成jiffies值的方法是:用這個時間減去1970-01-0100:00:00+0000(UTC),然后把這個時間段換算成jiffies數值),這個jiffies值作為我們開機時的基準jiffies值存在。然后系統運行時每個時鐘節拍的末尾都會給jiffies這個全局變量加1,因此操作系統就使用jiffies這個全局變量記錄了下來當前的時間。當我們需要當前時間點時,就用jiffies這個時間點去計算(計算方法就是先把這個jiffies值對應的時間段算出來,然后加上1970-01-0100:00:00+0000(UTC)即可得到這個時間點)因此,操作系統只在開機時讀一次RTC,整個系統運行過程中RTC是無作用的。RTC的真正作用其實是在OS的2次開機之間進行時間的保存。
2. Linux系統時間API
time
當前時間距離1970-01-0100:00:00+0000(UTC)的多少秒。(time內部就是用jiffies換算得到的秒數。)
gmtime / localtime
- 把time得到的秒數變成一個struct tm結構體表示的時間。gmtime得到的是國際時間,而localtime得到的是本地時間(計算機所設置的時區對應的本地時間)。
mktime
用來完成相反方向的轉換(struct tm到time_t)
asctime strftime
從struct tm出發得到字符串格式的時間。
ctime
從time_t出發得到字符串格式的時間。
#include <stdio.h>
#include <time.h>int main() {time_t current_time;current_time = time(NULL);if (current_time < 0){perror("time");exit(-1);}printf("Current time: %ld\n", current_time);printf("%s\n",ctime(¤t_time));return 0;
}