目錄gmtime / localtime / timegm / mktime / strftime / struct tm 是等與當前時間無關的時間格式轉換函式。
用於讓程式等待一段時間或安排計畫任務:
對於多執行緒服務端程式設計:
gettimeofday(2) 原型:
#include int gettimeofday(struct timeval *tv, struct timezone *tz);
計時選gettimeofday(2) 原因:
1)time(2)精度太低,ftime(3)已被廢棄;clock_gettime(2)精度最高,但其系統呼叫開銷比gettimeofday(2)大。
2)在x86-64平台上,gettimeofday(2)不是系統呼叫,而是在使用者態實現的,沒有上下文切換和陷入核心的開銷。
參考:3)gettimeofday(2)解析度1us,而且現在的實現確實能達到,滿足日常計時需要。
struct timeval ;
可自定義timestamp類,用int64_t來表示從unix epoch到現在的微妙數,範圍可達30萬年。
定時選timerfd_*的原因:
1)sleep(3) / alarm(3) / usleep(3) 在實現時有可能用了sigalrm訊號,在多執行緒程式中處理訊號相當麻煩,應盡量避免。而且,如果主程式和程式庫都用了sigalrm,就糟糕了。
2)nanosleep(2)和clock_nanosleep(2)執行緒安全,但在非阻塞網路程式設計中,不能讓執行緒掛起來等待一段時間,這樣程式會失去響應。正確的做法是註冊乙個時間**函式。
3)getitimer(2)和timer_create(2)也是用訊號來deliver(遞達)超時,在多執行緒程式中也會很麻煩。timer_create(2)可以指定訊號的接收方是程序還是執行緒,是個進步,但訊號處理函式(signal handler)能做的事情很受限。
4)timerfd_create(2)把時間變成乙個檔案描述符,該「檔案」在定時器超時的那一刻變得可讀,這樣就能很方便地融入select(2) / poll(2)框架中,用統一的方式來處理io事件和超時事件,這也是reactor模式長處。
5)傳統reactor利用select(2) / poll(2) / epoll(4) 的timeout來實現定時功能,但poll(2)和epoll_wait(2)的定時精度只有毫秒,遠低於timerfd_settime(2) 的定時精度。
[1]陳碩. linux多執行緒服務端程式設計[m]. 電子工業出版社, 2013.
Linux 網路程式設計中的 select 函式
我們這裡簡單的說下 select 的作用,並給出 select 的客戶端例項。我們知道 select 是io 多路復用的乙個最簡單支援,poll 和 epoll 是 select 的公升級版。我們通常會遇到這樣乙個問題 當客戶端阻塞在 fgets 等待客戶輸入的時候,伺服器端斷開連線。而客戶端卻不能...
linux程式設計中的時間
在linux中的時間有 time t和struct tm time t的定義為type long time t time t描述的時間是從1970年1月1日0時0分0秒到獲取時間的那一秒的秒數。函式time null 可以獲取當前的時間並以time t的型別返回。time t 獲取到的時間不夠直觀,...
linux 時間程式設計相關函式
時間的型別說明 coordinated universal time utc 世界標準時間,格林威治標註時間 greenwich mean time,gmt calendar time 日曆時間。1970年1月1日0點到此時的秒數。時間獲取函式 time t time time t t 功能描述 該...