c實現毫秒 微秒級定時器

2021-08-19 02:20:45 字數 1056 閱讀 5149

秒級定時器,都知道可以用sleep實現,但如果要實現毫秒級呢?usleep?

使用select實現

select函式原型:int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);

引數說明:

slect的第乙個引數nfds為fdset集合中最大描述符值加1,fdset是乙個位陣列,其大小限制為__fd_setsize(1024),位陣列的每一位代表其對應的描述符是否需要被檢查。

select的第二三四個引數表示需要關注讀、寫、錯誤事件的檔案描述符位陣列,這些引數既是輸入引數也是輸出引數,可能會被核心修改用於標示哪些描述符上發生了關注的事件。所以每次呼叫select前都需重新初始化fdset。

timeout引數為超時時間,該結構會被核心修改,其值為超時剩餘的時間。

如果我們指定了引數timeval的值,而將其他引數都置為0或者null,那麼在時間耗盡後,select函式便返回,基於這一點,我們可以利用select實現精確定時。

一、秒級定時器

void seconds_sleep(unsigned seconds)while(err

<0 && errno==eintr);

}

二、毫秒級別定時器

void milliseconds_sleep(unsigned

long msec)while(err<0 && errno==eintr);

}

三、微妙級別定時器

void microseconds_sleep(unsigned

long usec)while(err<0 && errno==eintr);

}

關於精確度,可以看參考2、3

參考 linux使用select實現精確定時器詳解

關於usleep定時和使用select 準確率說明

再論精確延時(usleep,nanosleep,select)

C 11的chrono庫,實現毫秒微秒級定時

c 11有了chrono庫,可以很容易的實現定時功能。chrono chrono庫主要包含了三種型別 時間間隔duration 時鐘clocks和時間點time point。duration duration表示一段時間間隔,用來記錄時間長度,可以表示幾秒鐘 幾分鐘或者幾個小時的時間間隔,durat...

兩個C 毫秒級定時器

test time.cpp 定義控制台應用程式的入口點。include stdafx.h include timer.h include timecounter.h define n 10000 define test pro for int i 0 i n i printf loop ok.n n...

Linux setitimer定時器(微秒精度)

標頭檔案 include int setitimer int which,const struct itimerval new value,struct itimerval old value 設定定時器 setitimer提供三種型別的定時器 即which的值 1.itimer real 以實際時...