Ⅰ linux 內核 | 內核的時間函數
在Linux內核中,獲取系統時間的功能在最新的內核版本(例如Linux kernel 5.10.20)中已經發生了改變。原有的使用struct timeval和對應的函數void do_gettimeofday(struct timeval *tv)來獲取時間的方式已經不再適用。因此,需要採用新的API來獲取當前的系統時間。
最新的獲取系統時間的API主要基於結構體struct timespec64,該結構體定義在include/linux/time64.h文件中。其中,包含了一個64位的時間戳和一個32位的納秒偏移量,提供了更高的時間精度和更大的時間范圍。
具體來說,內核提供了以下四個API來獲取系統時間:
以上四個API提供了不同的時間概念,滿足了各種不同場景的需求。例如,在測量內核中函數執行時間時,可以使用ktime_get_boottime_ts64()函數獲取自系統啟動以來的時間,然後再次調用該函數獲取當前時間,通過計算兩次時間的差值,就可以得到函數執行所需的時間。
獲取系統時間的API在內核源碼中的實現位於kernel/time/timekeeping.c文件中,具體的函數定義和實現細節可以在這里找到。此外,學習Linux內核源碼分析可以參考ke.qq.com/course/403254...的地址,提供了一些相關的資源和文檔。
為了方便學習和交流,推薦加入Linux內核源碼分析交流群(加入群聊的地址:點擊1095678385加入)。在群中可以分享和交流個人覺得比較好的學習資料和書籍,這些資源可以幫助學習者更深入地理解Linux內核的原理和實現。
Ⅱ Linux時間的獲取與使用
Linux系統中的時間包含兩種形式,日歷時間和進程時間。日歷時間表示從1970年1月1日0點(UTC時間)以來的秒數累計值,通過time_t數據類型保存,最後轉換得到我們熟悉的24小時或12小時制時間。而進程時間,即CPU時間,衡量進程使用中央處理器資源的量,以時鍾滴答計算。
獲取日歷時間的函數time()返回時間戳,為從1970年1月1日0點到現在經歷的秒數,如返回值1533287924。為了獲得更高精度的時間,使用gettimeofday()和clock_gettime()函數。gettimeofday()函數用timeval結構體保存微秒精度的時間戳,clock_gettime()函數用timespec結構體保存納秒精度的時間戳。
將時間戳轉化為日/月/年的時間,使用tm結構體。通過gmtime()和localtime()函數將time_t類型的時間戳轉換為tm結構體表示的日期時間。固定格式列印時間,可以使用ctime()和asctime()函數,但這兩個函數已被標記為棄用。更安全的方法是採用strftime()函數,它支持自定義格式化輸出日期和時間。
在業務程序中,對比時間的先後通常通過時間戳進行,mktime()函數用於將struct tm結構體轉換為time_t的時間戳,便於比較和計算。但在轉換時需要注意,使用localtime()函數得到的時間戳是從1900年1月1日開始計算的,可能需要調整以得到准確結果。
Linux系統中的進程時間表示進程使用CPU的時間,分為用戶時間和內核時間兩部分。clock()函數提供了一個簡單的介面,返回值描述進程使用的總的CPU時間,計量單位為CLOCKS_PER_SEC。times()函數提供了更詳細的進程時間表示,返回值的計量單位由sysconf(SC_CLK_TCK)確定。
通過以上描述,我們可以清楚地理解Linux系統中時間的獲取與使用方法,以及不同函數之間的關系,為實際編程提供有力支持。
Ⅲ gettimeofday()鍜宼ime()鐨勫尯鍒
UNIX鍙奓inux鐨勬椂闂寸郴緇熸槸鐢便屾柊綰鍏冩椂闂淬岴poch寮濮嬭$畻璧鳳紝鍗曚綅涓虹掋侲poch鏄鎸囧畾涓1970騫1鏈1鏃ュ噷鏅ㄩ浂鐐歸浂鍒嗛浂縐掞紝鏍兼灄濞佹不鏃墮棿銆傜洰鍓嶅ぇ閮ㄤ喚鐨刄NIX緋葷粺閮芥槸鐢32浣嶆潵璁板綍鏃墮棿錛屾e艱〃紺轟負1970浠ュ悗錛岃礋鍊煎垯琛ㄧず1970騫翠互鍓嶃備笅闈㈢湅涓媡ime.h涓鐨則ime鍑芥暟錛宻ys/time.h涓鐨刧ettimeofday鍑芥暟#include<time.h>
#include<sys/time.h>
#include<stdio.h>int main(){
time_t tt;
struct timeval tv;
tt=time(NULL);
gettimeofday(&tv,NULL);
printf("time_t sec is %d\n",tt);
printf("gettimeofday tv_sec is %d, usec is %d \n",tv.tv_sec,tv.tv_usec);
}PS: time 涓 gettimeofday 涓や釜鍑芥暟寰楀埌鐨勯兘鏄浠嶦poch寮濮嬪埌褰撳墠鐨勭掓暟(tt=tv.tv_sec)錛岃屽悗鑰呰繕鑳藉緱鍒版洿綺劇粏鐨勫井縐掔駭緇撴灉錛屽嵆tv_sec*(10^6)+tv_usec涓轟粠Epoch寮濮嬪埌褰撳墠鐨勫井縐掓暟
Ⅳ 如何在Windows下編制與Linux系統對應的C語言gettimeofday函數
實際上,windows和Linux獲得時間的機制是不一樣的,不是靠代碼就能夠完成。想在windows下實現gettimeofday,其實就是windows取時間的方式,還有Linux提供了漸進修改時間的介面adjtime(),而windows就沒有。
精度達到微妙是不可能的,因為計算機本身的時間片10-15ms左右,不管是Linux和windows,因此不可能達到那個精度。
另外系統時間和RTC時間也是不同的概念,當然讀RTC時間成本很高,但是准確,可以用匯編或具體的庫來讀,但是只是一瞬間的參考,按長遠來說也是很不穩定的,做多10-15ms精度,當然,你可以自己用代碼時間一個時間估計的過程,用演算法來彌補,給出誤差分析,但這個是數學了。