Linux Timer定時(shí)器

timerfd為Linux為用戶程序提供的定時(shí)器接口悔政,該接口基于文件描述符晚吞,通過文件描述符的可讀事件進(jìn)行超時(shí)通知,且能夠被用于epoll/select谋国。主要有三個函數(shù)槽地。

頭文件: include <sys/timerfd.h>

int timerfd_create(int clockid, int flags)

功能: 生成定時(shí)器,返回文件描述符芦瘾。
clockid: CLOCK_MONOTONIC或CLOCK_REALTIME捌蚊,其中CLOCK_MONOTONIC表示獲取的時(shí)間為系統(tǒng)重啟到現(xiàn)在的時(shí)間,更改系統(tǒng)時(shí)間對其沒有影響近弟。CLOCK_REALTIME表示從1970.1.1到目前的時(shí)間缅糟,更改系統(tǒng)時(shí)間會更改獲取的值。
flags: TFD_NONBLOCK(非阻塞), TFD_CLOEXEC(同O_CLOEXEC)祷愉。
return: timer的文件描述符窗宦。

int timerfd_settime(int tfd, int flags, const struct itimerspec *newValue, struct itimerspec *oldValue)

功能: 用于啟動或關(guān)閉指定fd的定時(shí)器。
tfd: timerfd二鳄,由timerfd_create函數(shù)返回做修。
flags: 1表示設(shè)置的是絕對時(shí)間影所;0表示相對時(shí)間米罚。
newValue: 指定新的超時(shí)時(shí)間征讲,若newValue.it_value非0則啟動定時(shí)器,否則關(guān)閉定時(shí)器欺殿。若newValue.it_interval為0則定時(shí)器只定時(shí)一次寄纵,否則之后每隔設(shè)定時(shí)間超時(shí)一次。
oldValue:不為NULL時(shí)則返回定時(shí)器這次設(shè)置之前的超時(shí)時(shí)間祈餐。
return:失敗則返回-1擂啥。

struct timespec
{
time_t tv_sec; //秒
long tv_nsec; //納秒
}
struct itimerspec
{
struct timespec it_interval; //首次超時(shí)后哄陶,每隔it_interval超時(shí)一次
struct timespec it_value; //首次超時(shí)時(shí)間
}

int timerfd_gettime(int fd, struct itimerspec *curValue)

功能: 用于獲取距離下次超時(shí)還剩下的時(shí)間帆阳。如果調(diào)用時(shí)定時(shí)器已經(jīng)到期(即超過it_value時(shí)間),并且定時(shí)器處于循環(huán)模式(即it_interval不為0)屋吨, 那么調(diào)用該函數(shù)后定時(shí)器重新開始計(jì)時(shí)蜒谤。
fd: timerfd,由timerfd_create函數(shù)返回至扰。
curValue: 返回距離下次超時(shí)剩下的時(shí)間鳍徽。
return:失敗返回-1

讀取timerfd

當(dāng)定時(shí)器超時(shí),timerfd可讀敢课,返回uint64_t類型的整數(shù)阶祭,為超時(shí)的數(shù)目(指有多少個超時(shí)未讀)绷杜,如果定時(shí)器沒有發(fā)生超時(shí)事件,若timerfd為阻塞時(shí)濒募,read將阻塞鞭盟,若timerfd為非阻塞時(shí),返回EAGAIN錯誤瑰剃。如果read是的數(shù)據(jù)小于8字節(jié)以EINVAL錯誤返回齿诉。

樣例代碼

#include <sys/timerfd.h>  
#include <sys/epoll.h>
#include <unistd.h>
#include <stdint.h>
#include <iostream>
using namespace std;

const int EPOLL_SIZE = 10;

int main(int argc, char* argv[])
{
    int tfd, epfd, nfds;
    struct epoll_event event;
    struct epoll_event events[EPOLL_SIZE];
        
    //創(chuàng)建timerfd, CLOCK_REALTIME為絕對時(shí)間晌姚,TFD_NONBLOCK為非阻塞
    tfd = timerfd_create(CLOCK_REALTIME, TFD_NONBLOCK);  
    if (tfd < 0)
    {
        cerr << "timerfd_create error!" << endl;
        return -1;
    }   
    struct timespec startTime, intervalTime;
    startTime.tv_sec = 0;    
    startTime.tv_nsec = 1;                                //相當(dāng)于立即到達(dá)超時(shí)時(shí)間
    intervalTime.tv_sec = 3;                             //首次超時(shí)后粤剧,每三秒超時(shí)一次
    intervalTime.tv_nsec = 0;
    struct itimerspec newValue;
    newValue.it_value = startTime;
    newValue.it_interval = intervalTime;
    //設(shè)置超時(shí)時(shí)間,且為相對時(shí)間
    if (timerfd_settime(tfd, 0, &newValue, NULL) < 0)
    {
        cerr << "timerfd_settime error!" << endl;
        return -1;
    }
    //用epoll來監(jiān)聽描述符
    epfd = epoll_create(EPOLL_SIZE);
    if (epfd < 0)
    {
        cerr << "epoll_create error!" << endl;
        return -1;
    }

    event.data.fd = tfd;
    event.events = EPOLLIN;
    if (epoll_ctl(epfd, EPOLL_CTL_ADD, tfd, &event) < 0)
    {
        cerr << "epoll_ctl error!" << endl;
        return -1;
    }
    
    uint64_t count = 0;
    while (1)
    {
        //非阻塞等待
        nfds = epoll_wait(epfd, events, EPOLL_SIZE, 0);
        if (nfds == 0) continue;
        for (int i = 0; i < nfds; i++)
        {
            if (events[i].events & EPOLLIN)
            {
                uint64_t data;
                read(events[i].data.fd, &data, sizeof(uint64_t));
                count += data;
                cout << "read: " << data << ", timer count: " << count << endl;
            }
        }
    }
    return 0;
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末挥唠,一起剝皮案震驚了整個濱河市抵恋,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌猛遍,老刑警劉巖馋记,帶你破解...
    沈念sama閱讀 222,252評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異懊烤,居然都是意外死亡梯醒,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,886評論 3 399
  • 文/潘曉璐 我一進(jìn)店門腌紧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來茸习,“玉大人,你說我怎么就攤上這事壁肋『排撸” “怎么了?”我有些...
    開封第一講書人閱讀 168,814評論 0 361
  • 文/不壞的土叔 我叫張陵浸遗,是天一觀的道長猫胁。 經(jīng)常有香客問我,道長跛锌,這世上最難降的妖魔是什么弃秆? 我笑而不...
    開封第一講書人閱讀 59,869評論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮髓帽,結(jié)果婚禮上菠赚,老公的妹妹穿的比我還像新娘。我一直安慰自己郑藏,他們只是感情好衡查,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,888評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著必盖,像睡著了一般拌牲。 火紅的嫁衣襯著肌膚如雪俱饿。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,475評論 1 312
  • 那天塌忽,我揣著相機(jī)與錄音稍途,去河邊找鬼。 笑死砚婆,一個胖子當(dāng)著我的面吹牛械拍,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播装盯,決...
    沈念sama閱讀 41,010評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼坷虑,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了埂奈?” 一聲冷哼從身側(cè)響起迄损,我...
    開封第一講書人閱讀 39,924評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎账磺,沒想到半個月后芹敌,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,469評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡垮抗,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,552評論 3 342
  • 正文 我和宋清朗相戀三年氏捞,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片冒版。...
    茶點(diǎn)故事閱讀 40,680評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡液茎,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出辞嗡,到底是詐尸還是另有隱情捆等,我是刑警寧澤,帶...
    沈念sama閱讀 36,362評論 5 351
  • 正文 年R本政府宣布续室,位于F島的核電站栋烤,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏挺狰。R本人自食惡果不足惜明郭,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,037評論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望她渴。 院中可真熱鬧达址,春花似錦蔑祟、人聲如沸趁耗。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,519評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽苛败。三九已至满葛,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間罢屈,已是汗流浹背嘀韧。 一陣腳步聲響...
    開封第一講書人閱讀 33,621評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留缠捌,地道東北人锄贷。 一個月前我還...
    沈念sama閱讀 49,099評論 3 378
  • 正文 我出身青樓,卻偏偏與公主長得像曼月,于是被迫代替她去往敵國和親谊却。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,691評論 2 361

推薦閱讀更多精彩內(nèi)容

  • 名稱 libev - 一個 C 編寫的功能全面的高性能事件循環(huán)哑芹。 概要 示例程序 關(guān)于 libev Libev 是...
    hanpfei閱讀 15,311評論 0 5
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理炎辨,服務(wù)發(fā)現(xiàn),斷路器聪姿,智...
    卡卡羅2017閱讀 134,711評論 18 139
  • 教程一:視頻截圖(Tutorial 01: Making Screencaps) 首先我們需要了解視頻文件的一些基...
    90后的思維閱讀 4,710評論 0 3
  • 1三個相關(guān)數(shù)據(jù)結(jié)構(gòu). 關(guān)于socket的創(chuàng)建碴萧,首先需要分析socket這個結(jié)構(gòu)體,這是整個的核心末购。 104 str...
    ice_camel閱讀 2,837評論 1 8
  • 對于廣電封這個封那個破喻,表示很無語,不知道該怎么向上級反映這些問題盟榴。
    Amanda_ss閱讀 104評論 0 0