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

2022-08-19 10:12:11 字數 1437 閱讀 6408

**自:

本文講述如何使用select實現超級時鐘。使用select函式,我們能實現微妙級別精度的定時器。同時,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引數為超時時間,該結構會被核心修改,其值為超時剩餘的時間。

利用select實現定時器,需要利用其timeout引數,注意到:

1)select函式使用了乙個結構體timeval作為其引數。

2)select函式會更新timeval的值,timeval保持的值為剩餘時間。

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

timeval的結構如下:

**如下:

struct timeval

我們可以看出其精確到microseconds也即微妙。

一、秒級定時器

**如下:

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);

}現在我們來編寫幾行**看看定時效果吧。

**如下:

#include

#include

#include

int main()

}注:timeval結構體中雖然指定了乙個微妙級別的解析度,但核心支援的分別率往往沒有這麼高,很多unix核心將超時值向上捨入成10ms的倍數。此外,加上核心排程延時現象,即定時器時間到後,核心還需要花一定時間排程相應程序的執行。因此,定時器的精度,最終還是由核心支援的分別率決定。

linux下使用select實現精確定時器

src linux下使用select實現精確定時器 在編寫程式時,我們經常回用到定時器。本文講述如何使用select實現超級時鐘。使用select函式,我們能實現微妙級別精度的定時器。同時,select函式也是我們在編寫非阻塞程式時經常用到的乙個函式。首先看看select函式原型如下 int sel...

linux下使用select實現精確定時器

在編寫程式時,我們經常回用到定時器。本文講述如何使用select實現超級時鐘。使用select函式,我們能實現微妙級別精度的定時器。同時,select函式也是我們在編寫非阻塞程式時經常用到的乙個函式。首先看看select函式原型如下 int select int nfds,fd set readfd...

python使用select實現非同步通訊

當乙個伺服器需要與多個客戶端進行通訊時,可以使用多程序或者多執行緒的伺服器,也可以使用select模組,它可以實現非同步通訊。python中的select模組包含了poll 和select select的原型為 rlist,wlist,xlist timeout 其中rlist是等待讀取的物件,wl...