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

2021-07-10 18:01:32 字數 1261 閱讀 8512

src: 

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

在編寫程式時,我們經常回用到定時器。本文講述如何使用select實現超級時鐘。使用select函式,我們能實現微妙級別精度的定時器。同時,select函式也是我們在編寫非阻塞程式時經常用到的乙個函式。

首先看看select函式原型如下:

int

select(int nfds, fd_set *readfds, fd_set *writefds,

fd_set *exceptfds, struct timeval *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

intmain()

}

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

linux下select函式的使用

先看下列的例子程式 include include include include define stdin 0 define true 1 define false 0 define ulong unsigned long static struct timeval timelast static...

Linux下select函式的使用

一.select 函式詳細介紹 負值 select錯誤 正值 某些檔案可讀寫或出錯 0 等待超時,沒有可讀寫或錯誤的檔案 在有了select後可以寫出像樣的網路程式來!舉個簡單的例子,就是從網路上接受資料寫入乙個檔案中。main select等待3秒,3秒輪詢,要非阻塞就置0 char buffer...

Linux下select函式的使用

一.select 函式詳細介紹 負值 select錯誤 正值 某些檔案可讀寫或出錯 0 等待超時,沒有可讀寫或錯誤的檔案 在有了select後可以寫出像樣的網路程式來!舉個簡單的例子,就是從網路上接受資料寫入乙個檔案中。main select等待3秒,3秒輪詢,要非阻塞就置0 char buffer...