linux 多个定时器,timer: 一个Linux下的超级精简的多重定时器:可实现成千上万个定时任务,定时精度可达纳秒级别,且同一时间点可添加不同的任务!适用于云后台服务和嵌入式等各种环境。...

MT_Timer(MT译为Multiple或Multi)

一、介绍

一个Linux下的超级简洁的定时器:利用epoll机制和timerfd新特性实现的多重、多用、多个定时任务实现。只需要使用TIMER_CREATE()接口创建一个定时器实体,即可向其添加成千上万个定时任务,定时任务可达到纳秒级别的精度,且可在同一时间点添加不同的定时任务!。

二、软件接口

整个定时器包含如下几类接口。

创建和声明定时器实例:使用定时器的第一步就是使用TIMER_CREATE()创建一个定时器实例,在其它文件使用到该定时器时,使用TIMER_DECLEAR()进行声明:

TIMER_CREATE(name);

TIMER_DECLEAR(name);

初始化和反初始化定时器:在正式使用定时器之前,首先使用TIMER_INIT()初始化前面创建的定时器实例,name是实例名称,max是创建定时器要检测的定时任务数量;当不再使用定时器时,可使用TIMER_DEINIT()反初始化定时器(退出定时器,并释放所有资源):

TIMER_INIT(name, max);

TIMER_DEINIT(name);

添加和删除定时任务:

TIMER_ADD(name, itimespec, repeat, cb, data);

TIMER_DEL(name, timerfd);

TIMER_ADD()用于向定时器实例name中添加一个定时任务,其参数描述如下:

ittimespec是定时任务的定时时间和循环时间,其结构体类型如下:

struct timespec {

time_t tv_sec; // seconds

long tv_nsec; // nanoseconds

};

struct itimerspec {

struct timespec it_value;

struct timespec it_interval;

};

其中it_value即是超时时间(相对时间),若想定义周期定时任务,则设置it_interval成员;若不想定义周期定时任务,则需设置it_interval成员都为0。因此,第一次超时和后面周期定时任务是可以使用不同时间的。

repeat是周期定时任务的重复次数,若设置为**-1,代表永远重复;0,代表一次都不执行**;因此repeat应至少为1,或者使用-1;

cb为定时任务超时回调函数,其类型为:void (*timer_callback_t)(void *data);

data为定时任务回调函数的参数,为void *类型,用户可指定为自己定义的结构体;

TIMER_ADD()添加定时任务成功返回新定时任务的文件描述符,失败返回 < 0。返回的文件描述符,可用于在TIMER_DEL()中删除定时任务。

查询和清空定时任务

TIMER_COUNT(name);

TIMER_CLEAR(name);

TIMER_COUNT(name)用于查询定时器实例name中现存的定时任务个数;TIMER_CLEAR(name)用于清空定时器实例name中的所有定时任务。

三、使用实例

下面是一个非常简单的使用示例:共创建了两个定时任务,每个第一次超时都是3S,后面每隔1S超时一次;但第一个定时任务频次为8,第二个定时任务频次为3;当所有定时任务都超时后,输入回车即可退出:

#include

#include

#include

#include "mt_timer.h"

void timeout_handle(void *arg)

{

printf("[%ld]:timeout1\n", time(NULL));

}

void timeout_handler(void *arg)

{

printf("[%ld]:timeout2\n", time(NULL));

}

TIMER_CREATE(test);

int main(void)

{

int timer;

struct itimerspec itimespec;

TIMER_INIT(test, 10);

itimespec.it_value.tv_sec = 3;

itimespec.it_value.tv_nsec = 0;

itimespec.it_interval.tv_sec = 1;

itimespec.it_interval.tv_nsec = 0;

timer = TIMER_ADD(test, &itimespec, 8, timeout_handle, NULL);

TIMER_ADD(test, &itimespec, 3, timeout_handler, NULL);

printf("[%ld]:timer_add : %d\n", time(NULL), TIMER_COUNT(test));

sleep(4);//getchar();

TIMER_DEL(test, timer);

printf("[%ld]:timer_del : %d\n", time(NULL), TIMER_COUNT(test));

TIMER_CLEAR(test);

printf("[%ld]:timer_clear : %d\n", time(NULL), TIMER_COUNT(test));

getchar();

TIMER_DEINIT(test);

return 0;

}

四、赞赏作者

d6566131af63a650f81c5239d576fc02.png

五、参与贡献

Fork 本仓库

新建 Feat_xxx 分支

提交代码

新建 Pull Request

六、码云特技

使用 Readme_XXX.md 来支持不同的语言,例如 Readme_en.md, Readme_zh.md

GVP 全称是码云最有价值开源项目,是码云综合评定出的优秀开源项目

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/564162.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++文件类

C 标准类库中有三个类可以用于文件操作&#xff0c;它们统称为文件流类。这三个类是&#xff1a; ifstream&#xff1a;用于从文件中读取数据。ofstream&#xff1a;用于向文件中写人数据。fstream&#xff1a;既可用于从文件中读取数据&#xff0c;又可用于 向文件中写人数据。…

window10内核Linux,windows 10中发布完整的Linux内核

5月8日消息&#xff1a; 近年来&#xff0c;微软对Linux开发者社区的支持令许多人感到惊讶&#xff0c;包括将诸如Bash shell之类的东西引入到Windows&#xff0c;或者在Windows 10中支持原生OpenSSH&#xff0c;甚至包括Windows应用商店上架了Ubuntu、SUSE Linux和Fedora。现在…

C++ open 打开文件

在对文件进行读写操作之前&#xff0c;先要打开文件。打开文件有以下两个目的&#xff1a; 1 . 通过指定文件名&#xff0c;建立起文件和文件流对象的关联&#xff0c;以后要对文件进行操作时&#xff0c;就可以通过与之关联的流对象来进行。 2 . 指明文件的使用方式。使用方…

c语言scanf函数隐藏的缓冲区,零基础学C语言 笔记四 Scanf函数清除缓冲区

Scanf函数清除缓冲区之前涉及到scanf会先到缓冲区看看是否存在数据&#xff0c;若存在数据&#xff0c;就直接拿缓冲区的数据过来使用&#xff0c;这就涉及到了一个问题&#xff0c;那如果缓冲区的数据不是我想要的呢&#xff1f;方法一&#xff1a;我们用scanf吸收掉我们的代码…

C++ 流类和流对象

程序中常用的 cin 和 cout&#xff0c;分别用于从键盘输入数据和向屏幕输出数据&#xff08;简称为标准 I/O&#xff09;。除此之外&#xff0c;程序还可以从文件中读入数据&#xff0c;以及向文件中写入数据&#xff08;简称为文件 I/O)。 数据输入和输出的过程也是数据传输的…

C++ cout格式化输出

希望按照一定的格式进行输出&#xff0c;如按十六进制输出整数&#xff0c;输出浮点数时保留小数点后面两位&#xff0c;输出整数时按 6 个数字的宽度输出&#xff0c;宽度不足时左边补 0&#xff0c;等等。C 中的 cout 对象则使用流操作算子&#xff08;你也可以叫做格式控制符…

C语言按各科分数段统计人数,(更新啦)学校学生成绩统计通用模板(科目、分数、统计分数段等均可自定,班级数、学生人数不受限制)...

更新说明&#xff1a;1、增加了导入、导出数据功能。2、该功能可以实现版本更新时不用手动复制数据&#xff0c;可实现一键导入导出。导语微信号☞gdpc-service这是一款适用于学校平时统一考试成绩统计表。这是长期根据学校的需求设计出的成绩统计&#xff0c;学生成绩清晰明了…

ndows10同时打印多份文档,Windows10如何同时重命名多个文件

在Win10系统中整理重要文件时&#xff0c;很多用户都会对文件进行重命名&#xff0c;以便节省更多的时间。而如果文件数量非常多的话&#xff0c;我们就需要对其进行批量重命名。那么&#xff0c;这该如何操作呢&#xff1f;今天&#xff0c;小编就给大家分享一下Win10系统同时…

C语言数理逻辑题目,数学逻辑推理题整理,看看你能答对多少

年龄的秘密A、B、C三人的年龄一直是一个秘密.将A的年龄数字的位置对调一下,就是B的年龄;C的年龄段两倍是A与B两个年龄的差数;而B的年龄是C的10倍.请问&#xff1a;A、B、C三人的年龄各是多少?失误的程序员高先生是一个高级程序员&#xff0c;但是他最近设计的三款机器人却出了…

android 自定义库,Android自定义Log库

背景我们在开发的时候肯定会打一些Log&#xff0c;特别是在调试代码或者bug的时候&#xff0c;我们都会打一些Log日志来记录&#xff0c;但是当我们发布正式版本的时候&#xff0c;尼玛&#xff0c;要一行一行的去掉&#xff0c;这就尴尬了。懵逼状态励志封装Log库本来想使用gi…

C++ 处理输入输出错误

处理输入输出时&#xff0c;我们必须预计到其中可能发生的错误并给出相应的处理措施。 当我们输入时&#xff0c;可能会由于人的失误&#xff08;错误理解了指令、打字错误等&#xff09;、文件格式不符、错误估计了情况等原因造成读取失败。当我们输出时&#xff0c;如果输出设…

各种语言的 Hello World

学习编程的小伙伴们可能会发现&#xff0c;不敢我们学习哪种语言&#xff0c;我们的第一个程序都是Hello World!&#xff0c;所以我们非常有必要清楚的知道Hello World!使用每一种编程语言的写法。 使用C语言实现Hello World! #includeint main(void){printf("Hello Wor…

Android拦截浏览器广告,浏览器拦截广告的几种方法

悬浮闪动的弹窗广告和牛皮癣一样铺满全屏的低质广告&#xff0c;极大地破坏了浏览网页的体验。通过启用浏览器自带的广告拦截功能&#xff0c;或为浏览器安装广告拦截插件&#xff0c;能够还原网页原本的清爽真容。浏览器自带-安卓广告拦截操作说明口碑比较好的 Via、夸克和 X浏…

android打包规范包含第三方库aar,Android Studio 打包AAR和第三方静态库(示例代码)

需求现在有一个第三方库libstatic_add.a和对应的头文件static.h&#xff0c;要求封装一个Module&#xff0c;该Module依赖这个静态库&#xff0c;要求打包的Module包含该静态库。方案创建Android Studio Library Project创建Project时&#xff0c;记得添加"Include C Sup…

C++ 四种类型转换运算符

隐式类型转换是安全的&#xff0c;显式类型转换是有风险的&#xff0c;C语言之所以增加强制类型转换的语法&#xff0c;就是为了强调风险&#xff0c;让程序员意识到自己在做什么。 但是&#xff0c;这种强调风险的方式还是比较粗放&#xff0c;粒度比较大&#xff0c;它并没有…

Android leak内存,GitHub - jin870132/memoryleakdemo: 安卓内存泄露几种常见形式及解决方案...

安卓内存泄露几种常见形式及解决方案一.前言1.内存溢出与内存泄露内存溢出(oom)&#xff0c;是指程序在申请内存时&#xff0c;没有足够的内存空间供其使用&#xff0c;出现oom&#xff1b;比如申请了一个integer,但给它存了long才能存下的数&#xff0c;那就是内存溢出。内存泄…

第二批鸿蒙手机排行,鸿蒙系统第二批升级机型有哪些 鸿蒙系统第二批升级机型名单一览...

华为6月2日召开开启鸿蒙发布会&#xff0c;很多华为手机的用户都想第一时间用上鸿蒙手机系统&#xff0c;今天就给大家带来鸿蒙系统第二批升级机型名单一览&#xff0c;一起来看看吧鸿蒙系统第二批升级机型名单一览具体机型&#xff1a;HUAWEI Mate20 SeriesHUAWEl nova 8 Seri…

VC2010 项目的创建

在VC2010中创建一个项目 1 . 创建新项目。打开我们的VC2010&#xff0c;点工具栏第一个按钮&#xff08;New Project&#xff09;&#xff0c;或者菜单 File -> New -> Project…&#xff0c;或者按快捷键 CtrlShiftN&#xff0c;几种方式都可以。 2 . 在 “New Project…

html5教学案例撰写,怎样撰写教育教学案例

怎样撰写教育教学案例教学是教师的教和学生的学所组成的一种人类特有的人才培养活动。那么&#xff0c;怎样撰写教育教学案例呢?下面是小编收集整理的撰写教育教学案例的相关内容&#xff0c;希望对您有所帮助!1.撰写教育教学案例的思想准备要写好教育、教学案例&#xff0c;首…

error C2143: syntax error : missing ';' before '}'

我们在运行C程序的时候经常会遇到错误&#xff0c;如果你遇到了这个错误&#xff1a;error C2143: syntax error : missing ‘;’ before ‘}’&#xff0c;那麽我将帮你解决这个错误。 错误展示 完整代码 #include <stdio.h> #define exchange(a,b){int t; ta;ab;bt} …