定时器

可以用系统定时器信号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学习的更多相关文章

  1. MySQL 定时器EVENT学习

    原文:http://blog.csdn.net/lifuxiangcaohui/article/details/6583535 MySQL 定时器EVENT学习 MySQL从5.1开始支持event功 ...

  2. Linux定时器 timerfd使用

    英文使用手册原汁原味,一手资料. NAME       timerfd_create, timerfd_settime, timerfd_gettime - timers that notify vi ...

  3. Linux使用定时器timerfd 和 eventfd接口实现进程线程通信

    body, table{font-family: 微软雅黑; font-size: 13.5pt} table{border-collapse: collapse; border: solid gra ...

  4. 定时器——Cocos2d-x学习历程(十一)

    1.定时器 利用场景.层和精灵等游戏元素,我们可以构建游戏的框架,但是此时的游戏仍然是静止不动的.在一切游戏中,游戏的状态都会随着时间的流逝而改变,同时我们还需要定时进行一些逻辑判断,例如鱼和子弹的碰 ...

  5. 【转载】Java定时器的学习

    前几看了一下<thinking in java>了解到java原生的Times类有两个问题: (1)Timer是启动单个线程来处理所有的时间任务,如果一个任务耗时很久,那么如果在执行这个过 ...

  6. c#进程、定时器初步学习

    首先是什么原因让我做这个小项目的呢,是因为在知乎里看到的游侠的文章才尝试着自己做的,文章地址是:https://www.zhihu.com/question/48811975 开始做的时候我是照着文章 ...

  7. Linux Timer定时器【转】

    转自:https://www.jianshu.com/p/66b3c75cae81 timerfd为Linux为用户程序提供的定时器接口,该接口基于文件描述符,通过文件描述符的可读事件进行超时通知,且 ...

  8. linux新定时器:timefd及相关操作函数

    timerfd是Linux为用户程序提供的一个定时器接口.这个接口基于文件描述符,通过文件描述符的可读事件进行超时通知,所以能够被用于select/poll的应用场景. 一,相关操作函数 #inclu ...

  9. (二十四)linux新定时器:timefd及相关操作函数

    timerfd是Linux为用户程序提供的一个定时器接口.这个接口基于文件描述符,通过文件描述符的可读事件进行超时通知,所以能够被用于select/poll的应用场景. 一,相关操作函数 #inclu ...

随机推荐

  1. RocketMQ详解(三)启动运行原理

    专题目录 RocketMQ详解(一)原理概览 RocketMQ详解(二)安装使用详解 RocketMQ详解(三)启动运行原理 RocketMQ详解(四)核心设计原理 RocketMQ详解(五)总结提高 ...

  2. 彻底解决Hive小文件问题

    最近发现离线任务对一个增量Hive表的查询越来越慢,这引起了我的注意,我在cmd窗口手动执行count操作查询发现,速度确实很慢,才不到五千万的数据,居然需要300s,这显然是有问题的,我推测可能是有 ...

  3. git报错:Auto Merge Failed; Fix Conflicts and Then Commit

    本文来源:http://blog.csdn.net/trochiluses/article/details/101007191.出错场景: 协同开发时,我们从远程服务器上pull下代码的时候,出现以下 ...

  4. Jenkins持续集成体系 | 最完整的介绍及资料

    这篇文章是来给大家普及Jenkins知识的, Jenkins能解决什么问题, 有哪些应用场景, 为何要掌握Jenkins, 掌握Jenkins后有哪些好处, 弄懂Jenkins需要掌握哪些知识 不知道 ...

  5. layui左右移动tab标签模版

    {% load staticfiles %} <!DOCTYPE html> <html> <head> <meta charset="utf-8& ...

  6. 鸿蒙内核源码分析(时钟任务篇) | 触发调度谁的贡献最大 | 百篇博客分析OpenHarmony源码 | v3.05

    百篇博客系列篇.本篇为: v03.xx 鸿蒙内核源码分析(时钟任务篇) | 触发调度谁的贡献最大 | 51.c.h .o 任务管理相关篇为: v03.xx 鸿蒙内核源码分析(时钟任务篇) | 触发调度 ...

  7. Springboot2.0整合Redis(注解开发)

    一. pom.xm文件引入对应jar包 <dependency> <groupId>org.springframework.boot</groupId> <a ...

  8. golang实现一个简单的websocket聊天室

    基本原理: 1.引入了 golang.org/x/net/websocket 包. 2.监听端口. 3.客户端连接时,发送结构体: {"type":"login" ...

  9. 火爆全网的《鱿鱼游戏》,今天用 Python 分析一波影评

    Hello,各位读者朋友们好啊,我是小张~ 这不国庆嘛,就把最近很火的一个韩剧<鱿鱼游戏>刷了下,这部剧整体剧情来说还是非常不错的,很值得一看, 作为一个技术博主,当然不能在这儿介绍这部剧 ...

  10. C#开发BIMFACE系列43 服务端API之图纸拆分

    BIMFACE二次开发系列目录     [已更新最新开发文章,点击查看详细] 在上一篇博客<C#开发BIMFACE系列42 服务端API之图纸对比>的最后留了一个问题,在常规业务场景下,一 ...