国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統(tǒng) > Linux > 正文

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

2019-10-26 18:37:22
字體:
供稿:網(wǎng)友
在編寫程序時,我們經(jīng)常會用到定時器。首先看看select函數(shù)原型如下:
代碼如下:
int select(int nfds, fd_set *readfds, fd_set *writefds,
                  fd_set *exceptfds, struct timeval *timeout);

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

我們可以看出其精確到microseconds也即微妙。
一、秒級定時器
代碼如下:
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(err<0 && errno==EINTR);
}

 二、毫秒級別定時器
代碼如下:
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(err<0 && errno==EINTR);
}

 三、微妙級別定時器
代碼如下:
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(err<0 && errno==EINTR);
}

現(xiàn)在我們來編寫幾行代碼看看定時效果吧。
代碼如下:
#include <stdio.h>
#include <sys/time.h>
#include <errno.h>
int main()
{
    int i;
    for(i=0;i<5;++i){
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 山东| 满城县| 新野县| 南京市| 墨玉县| 北碚区| 泸水县| 德钦县| 三台县| 康平县| 扎赉特旗| 米林县| 河池市| 东源县| 栾川县| 东阳市| 建昌县| 开平市| 克什克腾旗| 肥西县| 巫溪县| 澄城县| 长武县| 易门县| 长宁区| 东平县| 兴城市| 神木县| 河池市| 开鲁县| 甘孜| 察雅县| 池州市| 怀仁县| 罗平县| 原平市| 徐水县| 正蓝旗| 吴旗县| 墨脱县| 桓台县|