fd定时器--timerfd学习
定时器
可以用系统定时器信号SIGALARM
最近工作需要于是又发现了一个新玩意timerfd配合epoll使用。
man 手册看一下
TIMERFD_CREATE(2) Linux Programmer's Manual TIMERFD_CREATE(2) NAME
timerfd_create, timerfd_settime, timerfd_gettime - timers that notify via file descriptors SYNOPSIS
#include <sys/timerfd.h> int timerfd_create(int clockid, int flags); int timerfd_settime(int fd, int flags,
const struct itimerspec *new_value,
struct itimerspec *old_value); int timerfd_gettime(int fd, struct itimerspec *curr_value); DESCRIPTION
These system calls create and operate on a timer that delivers timer expiration notifications via a
file descriptor. They provide an alternative to the use of setitimer(2) or timer_create(2), with the
advantage that the file descriptor may be monitored by select(2), poll(2), and epoll(7). The use of these three system calls is analogous to the use of timer_create(2), timer_settime(2), and
timer_gettime(2). (There is no analog of timer_getoverrun(2), since that functionality is provided by
read(2), as described below.)
这是一个专门针对fd的定时器,通过fd可以读取定时数据(定时时间到了就会有数据回来,否则阻塞(阻塞模式))。
结合epoll使用先弄个epoll出来
/* init epoll */
int epollInit(){
int epFd = epoll_create(EPOLL_SIZE);
if (epFd < 0){
perror("epoll create");
return -1;
}
return epFd;
}
然后在弄个timerfd,并把它加入到epoll 事件中
int TimerFdInit(int epFd)
{
struct itimerspec new_value;
/*init time*/
new_value.it_value.tv_sec = 1;
new_value.it_value.tv_nsec = 0;
/*time interval*/
new_value.it_interval.tv_sec = 1;
new_value.it_interval.tv_nsec = 0; int timerFd = timerfd_create(CLOCK_MONOTONIC, 0);
if (timerFd < 0) {
cerr<<strerror(errno)<<endl;
return -1;
} int ret = timerfd_settime(timerFd, 0, &new_value, NULL);
if (ret < 0) {
cerr<<strerror(errno)<<endl;
close(timerFd);
return -1;
}
/* add to epoll */
struct epoll_event ev;
ev.events = EPOLLIN | EPOLLHUP | EPOLLRDHUP;
ev.data.fd = timerFd;
epoll_ctl(epFd, EPOLL_CTL_ADD, timerFd, &ev);
return timerFd;
}
接下来就去epoll_wait循环等待这个定时器的数据
int epollHandle(int epFd, int timerFd)
{
struct epoll_event epEvents[EPOLL_SIZE] = {};
int timeOut = -1;
uint64_t totalExp = 0;
while (1)
{
//blocked
int eventNum = epoll_wait(epFd, epEvents, EPOLL_SIZE, timeOut);
if(eventNum < 0) {
perror("epoll failure");
return -1;
} //handle epEvents
for(int i = 0; i < eventNum; ++i) {
int tmpFd = epEvents[i].data.fd;
if(epEvents[i].events & EPOLLIN) {
if (timerFd == tmpFd) {
/*handle timerFd*/
uint64_t tmpExp = 0;
/*must read*/
read(timerFd, &tmpExp, sizeof(uint64_t));
totalExp += tmpExp;
cout<<"timer count "<<totalExp<<endl;
}
}
}
}
return 0;
}
fd定时器--timerfd学习的更多相关文章
- MySQL 定时器EVENT学习
原文:http://blog.csdn.net/lifuxiangcaohui/article/details/6583535 MySQL 定时器EVENT学习 MySQL从5.1开始支持event功 ...
- Linux定时器 timerfd使用
英文使用手册原汁原味,一手资料. NAME timerfd_create, timerfd_settime, timerfd_gettime - timers that notify vi ...
- Linux使用定时器timerfd 和 eventfd接口实现进程线程通信
body, table{font-family: 微软雅黑; font-size: 13.5pt} table{border-collapse: collapse; border: solid gra ...
- 定时器——Cocos2d-x学习历程(十一)
1.定时器 利用场景.层和精灵等游戏元素,我们可以构建游戏的框架,但是此时的游戏仍然是静止不动的.在一切游戏中,游戏的状态都会随着时间的流逝而改变,同时我们还需要定时进行一些逻辑判断,例如鱼和子弹的碰 ...
- 【转载】Java定时器的学习
前几看了一下<thinking in java>了解到java原生的Times类有两个问题: (1)Timer是启动单个线程来处理所有的时间任务,如果一个任务耗时很久,那么如果在执行这个过 ...
- c#进程、定时器初步学习
首先是什么原因让我做这个小项目的呢,是因为在知乎里看到的游侠的文章才尝试着自己做的,文章地址是:https://www.zhihu.com/question/48811975 开始做的时候我是照着文章 ...
- Linux Timer定时器【转】
转自:https://www.jianshu.com/p/66b3c75cae81 timerfd为Linux为用户程序提供的定时器接口,该接口基于文件描述符,通过文件描述符的可读事件进行超时通知,且 ...
- linux新定时器:timefd及相关操作函数
timerfd是Linux为用户程序提供的一个定时器接口.这个接口基于文件描述符,通过文件描述符的可读事件进行超时通知,所以能够被用于select/poll的应用场景. 一,相关操作函数 #inclu ...
- (二十四)linux新定时器:timefd及相关操作函数
timerfd是Linux为用户程序提供的一个定时器接口.这个接口基于文件描述符,通过文件描述符的可读事件进行超时通知,所以能够被用于select/poll的应用场景. 一,相关操作函数 #inclu ...
随机推荐
- PHP获取当前网址路径
$_SERVER['REQUEST_SCHEME'] . '://' . $_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'] // 获取来源 function ...
- Java基础系列(22)- For循环详解
For循环 虽然所有循环结构都可以用while和dowhile表示,但是Java提供了另外一种语句for循环,使一些循环结构变动更加简单 for循环语句是支持迭代的一种通用结构,是最有效.最灵活的循环 ...
- 再谈OAuth授权
工作场景流程 大家都知道OAuth是用于第三方授权的,当你用其他的APP想访问微信账号的昵称.粉丝.联系人等信息,这里就需要微信进行授权,此时在APP的网页端是可以发现有微信登录的,点开会出现弹框,在 ...
- 对OOP的理解
OOP是面向对象编程Object Oriented Programming,特征分别是封装.继承.多态.抽象. 封装:封装是指将对象信息状态通过访问权限修饰符隐藏在对象内部,不允许外部程序直接访问,如 ...
- spring Data Jpa的依赖+配置
spring data jpa 是spring基于的orm框架,jpa规范的基础上封装的一套JPA应用框架 添加的相关依赖: <properties> <spring.version ...
- P4630-[APIO2018]Duathlon铁人两项【圆方树】
正题 题目链接:https://www.luogu.com.cn/problem/P4630 题目大意 \(n\)个点\(m\)条边的一张无向图,求有多少对三元组\((s,c,f)\)满足\(s\ne ...
- P5325-[模板]Min_25筛
正题 题目链接:https://www.luogu.com.cn/problem/P5325 题目大意 定义一个积性函数满足\(f(p^k)=p^k(p^k-1)\) 求\(\sum_{i=1}^nf ...
- P4756-Added Sequence【斜率优化】
正题 题目链接:https://www.luogu.com.cn/problem/P4756 题目大意 给出序列\(a\),设\(f(l,r)=|\sum_{i=l}^ra_i|\). \(m\)次询 ...
- PyCharm插件开发实践-PyGetterAndSetter
背景需求 在面向对象的设计中,典型如Java语言,为了控制对象属性的修改入口,我们常用的做法是把属性设置为private,然后通过getter和setter方法访问.修改该属性. 但是在Pthon语言 ...
- a标签的href属性拼接问题
<a id="nickName" href="/community/user/userinfo?nickName="></a> 如上所示 ...