主頁(yè) > 知識(shí)庫(kù) > linux使用select實(shí)現(xiàn)精確定時(shí)器詳解

linux使用select實(shí)現(xiàn)精確定時(shí)器詳解

熱門(mén)標(biāo)簽:客服外呼系統(tǒng)怎么樣 華鋒e路航港口地圖標(biāo)注 河南信譽(yù)好的不封卡電話外呼系統(tǒng) 如果做線上地圖標(biāo)注 揭陽(yáng)智能電話機(jī)器人推薦 地圖標(biāo)注員都是年輕人 百度地圖標(biāo)注錯(cuò)了有責(zé)任嗎 打電話機(jī)器人接我是他的秘書(shū) 江蘇云電銷(xiāo)機(jī)器人公司
在編寫(xiě)程序時(shí),我們經(jīng)常會(huì)用到定時(shí)器。首先看看select函數(shù)原型如下:
復(fù)制代碼 代碼如下:

int select(int nfds, fd_set *readfds, fd_set *writefds,
                  fd_set *exceptfds, struct timeval *timeout);

參數(shù)說(shuō)明:
slect的第一個(gè)參數(shù)nfds為fdset集合中最大描述符值加1,fdset是一個(gè)位數(shù)組,其大小限制為_(kāi)_FD_SETSIZE(1024),位數(shù)組的每一位代表其對(duì)應(yīng)的描述符是否需要被檢查。
select的第二三四個(gè)參數(shù)表示需要關(guān)注讀、寫(xiě)、錯(cuò)誤事件的文件描述符位數(shù)組,這些參數(shù)既是輸入?yún)?shù)也是輸出參數(shù),可能會(huì)被內(nèi)核修改用于標(biāo)示哪些描述符上發(fā)生了關(guān)注的事件。所以每次調(diào)用select前都需重新初始化fdset。
timeout參數(shù)為超時(shí)時(shí)間,該結(jié)構(gòu)會(huì)被內(nèi)核修改,其值為超時(shí)剩余的時(shí)間。
利用select實(shí)現(xiàn)定時(shí)器,需要利用其timeout參數(shù),注意到:
 1)select函數(shù)使用了一個(gè)結(jié)構(gòu)體timeval作為其參數(shù)。
 2)select函數(shù)會(huì)更新timeval的值,timeval保持的值為剩余時(shí)間。
如果我們指定了參數(shù)timeval的值,而將其他參數(shù)都置為0或者NULL,那么在時(shí)間耗盡后,select函數(shù)便返回,基于這一點(diǎn),我們可以利用select實(shí)現(xiàn)精確定時(shí)。
timeval的結(jié)構(gòu)如下:
復(fù)制代碼 代碼如下:

struct timeval{
long tv_sec;/*secons*
long tv_usec;/*microseconds*/
}

我們可以看出其精確到microseconds也即微妙。
一、秒級(jí)定時(shí)器
復(fù)制代碼 代碼如下:

void seconds_sleep(unsigned seconds){
    struct timeval tv;
    tv.tv_sec=seconds;
    tv.tv_usec=0;
    int err;
    do{
       err=select(0,NULL,NULL,NULL,tv);
    }while(err0 errno==EINTR);
}

 二、毫秒級(jí)別定時(shí)器
復(fù)制代碼 代碼如下:

void milliseconds_sleep(unsigned long mSec){
    struct timeval tv;
    tv.tv_sec=mSec/1000;
    tv.tv_usec=(mSec%1000)*1000;
    int err;
    do{
       err=select(0,NULL,NULL,NULL,tv);
    }while(err0 errno==EINTR);
}

 三、微妙級(jí)別定時(shí)器
復(fù)制代碼 代碼如下:

void microseconds_sleep(unsigned long uSec){
    struct timeval tv;
    tv.tv_sec=uSec/1000000;
    tv.tv_usec=uSec%1000000;
    int err;
    do{
        err=select(0,NULL,NULL,NULL,tv);
    }while(err0 errno==EINTR);
}

現(xiàn)在我們來(lái)編寫(xiě)幾行代碼看看定時(shí)效果吧。
復(fù)制代碼 代碼如下:

#include stdio.h>
#include sys/time.h>
#include errno.h>
int main()
{
    int i;
    for(i=0;i5;++i){
    printf("%d\n",i);
    //seconds_sleep(1);
    //milliseconds_sleep(1500);
    microseconds_sleep(1900000);
    }
}

 注:timeval結(jié)構(gòu)體中雖然指定了一個(gè)微妙級(jí)別的分辨率,但內(nèi)核支持的分別率往往沒(méi)有這么高,很多unix內(nèi)核將超時(shí)值向上舍入成10ms的倍數(shù)。此外,加上內(nèi)核調(diào)度延時(shí)現(xiàn)象,即定時(shí)器時(shí)間到后,內(nèi)核還需要花一定時(shí)間調(diào)度相應(yīng)進(jìn)程的運(yùn)行。因此,定時(shí)器的精度,最終還是由內(nèi)核支持的分別率決定。
分類(lèi): Linux
您可能感興趣的文章:
  • 簡(jiǎn)單談?wù)凩inux內(nèi)核定時(shí)器
  • Linux下實(shí)現(xiàn)定時(shí)器Timer的幾種方法總結(jié)
  • linux定時(shí)任務(wù)crontab 實(shí)現(xiàn)每秒執(zhí)行一次的方法
  • Linux Crontab 啟動(dòng) 、運(yùn)行 和編輯 查看的命令
  • linux下定時(shí)執(zhí)行任務(wù)的方法及crontab 用法說(shuō)明(收集整理)
  • linux crontab 實(shí)現(xiàn)每秒執(zhí)行的實(shí)例
  • linux定時(shí)器crontab的使用教程

標(biāo)簽:赤峰 淘寶邀評(píng) 許昌 馬鞍山 金昌 邵陽(yáng) 巴彥淖爾 婁底

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《linux使用select實(shí)現(xiàn)精確定時(shí)器詳解》,本文關(guān)鍵詞  linux,使用,select,實(shí)現(xiàn),精確,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《linux使用select實(shí)現(xiàn)精確定時(shí)器詳解》相關(guān)的同類(lèi)信息!
  • 本頁(yè)收集關(guān)于linux使用select實(shí)現(xiàn)精確定時(shí)器詳解的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章