(目錄)
先說一些在計算機中需要用到時間的地方:系統日志log、OS調度(時間片、定時器)等等~~
時間的計量
計時的方式發展:日晷、沙漏?-> 機械鐘 -> 石英振蕩器、晶振 -> 銫原子鐘 -> 氫原子鐘
計算機中的計時方式:
51單片機:晶振
嵌入式系統:定時器
PC:定時器
實時時鐘:獨立電源(CMOS電池、手機晶振)
Linux系統中的時間管理
定時器 + 實時時鐘
計算機啟動之后,Linux內核會先在實時時鐘中讀取時間,保存到內核中的全局變量xtime(墻上時間)中;jiffies:內核中的全局變量,系統啟動以來的節拍數。
C語言獲取當前時間
typedef long time_t;
time_t t = time(NULL); // 獲得當前時間,UTC時間,1979年1月1日0點開始,以秒為單位
stime(&t); // 設置時間
時間格式的轉化
#include <stdio.h>
#include <time.h>
int main(void)
{time t t=time(NULL);printf("%ld\n",t);struct tm *p;p=localtime(&t);printf ("%d-%d-%d "p->tm year +1900,p->tm mon +1,p->tm mday);printf("%d:%d:%d\n",p->tm hour, p->tm_min, p->tm_sec);p = gmtime(&t);printf ("%d-%d-%d ",p->tm year +1900,p->tm mon +1,p->tm mday);printf("%d:%d:%d\n",p->tm hour,p->tm min,p->tm sec);return 0;
}
這里p指向的struct tm類型的變量在靜態內存(庫內部)。?
安全替代方案
為解決線程安全和重入問題,Linux 提供了:
localtime_r
(可重入版本):-
struct tm result; localtime_r(&time_val, &result); // 結果存儲到用戶提供的 `result` 中
-
線程安全,因為每個線程使用獨立的內存。
-
用戶需自行管理存儲位置(如棧或堆)。
-
將時間轉化為字符串
?
#include <stdio.h>
#include <time.h>
int main(void)
{time t t= time(NULL);printf("%ld\n",t);char *str = NULL;str =ctime(&t);printf("%s\n",str);struct tm *p;p = gmtime(&t);printf("%d-%d-%d ".,p->tm year + 1900,p->tm mon + 1,p->tm mday);printf("%d:%d:%d\n",p->tm hour, p->tm_min, p->tm_sec);str = asctime(p);printf("%s",str);return 0;
}
用戶指定格式字符串
?
獲得高精度時間
微秒
納秒
Linux中的定時器
alarm
alarm(3) : 3秒之后,向該進程發送SIGALRM信號。
?interval timer
設置的時間到達后,會重置;alarm只有一次。