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 ...
随机推荐
- 羽夏看Win系统内核——简述
写在前面 此系列是本人一个字一个字码出来的,包括示例和实验截图.由于系统内核的复杂性,故可能有错误或者不全面的地方,如有错误,欢迎批评指正,本教程将会长期更新. 如有好的建议,欢迎反馈.码字不易, ...
- 关于vue-cli的安装
(一):*安装 vue-cli 参考: https://cn.vuejs.org/v2/guide/installation.html https://github.com/vuejs/vue-cli ...
- 2.1Java基础
2.1.9面向对象的三大特性(携程): 封装:把一个对象的属性隐藏在对象内部,外部对象不能直接访问这个对象的内部信息.但是可以提供一些可以被外界访问的方法来操作属性.就比如我们常常创建一个类,把他的属 ...
- Java基础系列(39)- 二维数组
多维数组 多维数组可以看成是数组的数组,比如二维数组就是一个特殊的一维数组,其每一个元素都是一个一维数组. 二维数组 int a[][]=new int[2][5]; 解析:以上二维数组a可以看成一个 ...
- Linux系列(21) - 光盘、U盘挂载
挂载光盘 mount命令.umount命令 step-1 建立挂载点 原理:相当于建立盘符,建个目录读取光盘内容 命令:[root@localhost ~]# mkdir /mnt/cdrom/ 备注 ...
- springboot pom.xml
Demo project for Spring Boot <?xml version="1.0" encoding="UTF-8"?> <pr ...
- PHP 一个树为另一棵树的子结构 [TO BE CONTINUED]
输入两棵二叉树A,B,判断B是不是A的子结构.(ps:我们约定空树不是任意一个树的子结构) <?php class TreeNode { private $val; private $left; ...
- 防刷功能的实现(thinkphp5)
$seconds = '3'; //时间段[秒] $refresh = '3';//最大次数 $cur_time = time(); if(Session::get('refresh_times')) ...
- P5363-[SDOI2019]移动金币【阶梯博弈,dp,组合数学】
正题 题目链接:https://www.luogu.com.cn/problem/P5363 题目大意 \(1\times n\)的网格上有\(m\)个硬币,两个人轮流向前移动一个硬币但是不能超过前一 ...
- P4494-[HAOI2018]反色游戏【圆方树】
正题 题目链接:https://www.luogu.com.cn/problem/P4494 题目大意 给出\(n\)个点\(m\)条边的一张无向图,节点有\(0/1\),每条边可以选择是否取反两边的 ...