日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

Linux环境编程 用户层定时器使用一 timerfd的使用

發(fā)布時間:2025/4/5 linux 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Linux环境编程 用户层定时器使用一 timerfd的使用 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

timerfd是linux提供的定時器機制,基于文件描述符,定時器精度最高可達納秒級別,接口包括定時器創(chuàng)建、啟動定時器、關閉定時器和刪除定時器。下面介紹一下timerfd? API接口和一個結合epoll使用的定時器demo。

1. 創(chuàng)建定時器?

#include <sys/timerfd.h> /** 功能 : 創(chuàng)建定時器* 返回值:成功返回定時器文件描述符,失敗返回-1* 參數(shù):? clockid可以是CLOCK_REALTIME(實時時鐘)或者CLOCK_MONOTONIC(遞增時鐘),實時時鐘可以被系統(tǒng)時間改變,后者不會。* 如果這里使用實時時鐘,當手動更改系統(tǒng)時間定時器也會受影響,而遞增時鐘則只受設置的時間值影響。* flags : 可選項包括TFD_NONBLOCK(非阻塞)和TFD_CLOEXEC,阻塞指的是當定時器未超時的時候,如果調用read(timerfd)會阻塞直*? 到定時器超時,如果設置TFD_NONLOCK,則會直接返回并返回-1. 這與套接字描述符類似。*/ int timerfd_create(int clockid, int flags); 如果這里使用實時時鐘,當手動更改系統(tǒng)時間定時器也會受影響,而遞增時鐘則只受設置的時間值影響。* flags : 可選項包括TFD_NONBLOCK(非阻塞)和TFD_CLOEXEC,阻塞指的是當定時器未超時的時候,如果調用read(timerfd)會阻塞直*? 到定時器超時,如果設置TFD_NONLOCK,則會直接返回并返回-1. 這與套接字描述符類似。*/ int timerfd_create(int clockid, int flags);

2. 啟動和停止定時器

/** 功能 定時器啟動和關閉* 返回值 : 成功返回0,失敗返回-1,并存儲錯誤碼到errno* 參數(shù): fd: 定時器描述符* flags: 0 或者TFD_TIMER_ABSTIME,0代表相對時間,即相對于當前時間多少,后者是絕對時間。* new_value: 當new_value.it_value非0時,用于設置定時器第一次超時時間,為0代表停止定時器new_value.it_interval:表示第一次超時后下一次超時的時間,為0代表定時器只超時一次* old_value: 如果不為NULL,則用來存儲當前時間。int timerfd_settime(int fd, int flags, const struct itimerspec *new_value, struct itimerspec *old_value);

3. 關閉定時器

/** 功能: 和普通描述符一樣,用完后使用close釋放* 參數(shù):timerfd為timerfd_create()創(chuàng)建的定時器描述符*/ close(timerfd);

4. 時間結構體

struct timespec {time_t tv_sec; /* Seconds */long tv_nsec; /* Nanoseconds */ };struct itimerspec {struct timespec it_interval; /* Interval for periodic timer */struct timespec it_value; /* Initial expiration */ };

下面是一個結合epoll使用的定時器demo,創(chuàng)建一個每隔2s超時的定時器并加入到epoll監(jiān)聽隊列中,每當定時器到期超時時產(chǎn)生一個讀事件,之后可以去執(zhí)行相應的定時器回調函數(shù)。

/** Description : linux 應用層編程之定時器timerfd的使用* Date :20180611* Author :mason* Mail : mrsonko@126.com**/#include <sys/timerfd.h> #include <sys/epoll.h> #include <unistd.h> #include <stdlib.h> #include <stdint.h> #include <stdio.h> #include<errno.h> #include <time.h>#define TIME_MAX 2 #define log(fmt, arg...) printf(""fmt, ##arg)void main() {int tfd; //定時器描述符int efd; //epoll描述符int fds, ret;uint64_t value;struct epoll_event ev, *evptr;struct itimerspec time_intv; //用來存儲時間tfd = timerfd_create(CLOCK_MONOTONIC, 0); //創(chuàng)建定時器if(tfd == -1) {log("create timer fd fail \r\n");return ;}time_intv.it_value.tv_sec = TIME_MAX; //設定2s超時time_intv.it_value.tv_nsec = 0;time_intv.it_interval.tv_sec = time_intv.it_value.tv_sec; //每隔2s超時time_intv.it_interval.tv_nsec = time_intv.it_value.tv_nsec;log("timer start ...\n");timerfd_settime(tfd, 0, &time_intv, NULL); //啟動定時器efd = epoll_create1(0); //創(chuàng)建epoll實例if (efd == -1) {log("create epoll fail \r\n");close(tfd);return ;}evptr = (struct epoll_event *)calloc(1, sizeof(struct epoll_event));if (evptr == NULL) {log("epoll event calloc fail \r\n");close(tfd);close(efd);return ;}ev.data.fd = tfd; ev.events = EPOLLIN; //監(jiān)聽定時器讀事件,當定時器超時時,定時器描述符可讀。epoll_ctl(efd, EPOLL_CTL_ADD, tfd, &ev); //添加到epoll監(jiān)聽隊列中while(1) {fds = epoll_wait(efd, evptr, 1, -1); //阻塞監(jiān)聽,直到有事件發(fā)生if(evptr[0].events & EPOLLIN){ ret = read(evptr->data.fd, &value, sizeof(uint64_t));if (ret == -1) log("read return -1, errno :%d \r\n", errno);elselog("*** timer up *** \n"); } }return ; }

實驗截圖:

代碼路徑:

git@github.com:FuYuanDe/timerfd.git

參考資料:

https://linux.die.net/man/2/timerfd_create

總結

以上是生活随笔為你收集整理的Linux环境编程 用户层定时器使用一 timerfd的使用的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內容還不錯,歡迎將生活随笔推薦給好友。