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++ bitset类

bitset 模板类由若干个位&#xff08;bit&#xff09;组成&#xff0c;它提供一些成员函数&#xff0c;使程序员不必通过位运算就能很方便地访问、修改其中的任意一位。bitset 模板类在头文件 中定义如下&#xff1a; template <size_t N> class bitset {... };size_t 可…

red flag linux指定域名,Red Flag Server 4.1 系统管理手册(适用桌面linux4.1) 6

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼第3章 文件系统管理 (三)--------------------------------------------------------------------------------3.6 LVM逻辑卷管理LVM 是 Logical Volume Manager 的简写&#xff0c;它为计算机提供了更高层次的磁盘存储解决方案&am…

什么是计算机文件

内存中存放的数据在计算机关机后就会消失。要长久保存数据&#xff0c;就要使用硬盘、光盘、U 盘等设备。为了便于数据的管理和检索&#xff0c;引入了“文件”的概念。 一篇文章、一段视频、一个可执行程序&#xff0c;都可以被保存为一个文件&#xff0c;并赋予一个文件名。…

linux下阻塞的系统调用,Linux下文件的阻塞与非阻塞对部分系统调用的影响

1.基本概念所谓的阻塞&#xff0c;即内核在对文件操作I/O系统调用时&#xff0c;如果条件不满足(可能需要产生I/O)&#xff0c;则内核会将该进程挂起。非阻塞则是发现条件不满足就会立即返回。此外需要注意的是非阻塞并不是轮询&#xff0c;不然就和阻塞没多大区别了&#xff0…

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语言窗口炸弹代码,C语言实现数字炸弹小游戏

本文实例为大家分享了C语言实现数字炸弹小游戏的具体代码&#xff0c;供大家参考&#xff0c;具体内容如下使用的是C语言# 内容#include#includeint main(){//变量char c_TheRequest 1;//开始界面的字符int in_Deltar 1,in_EnteredNumber,in_Sig;//游戏中输入数字及其判定所需…

C++ 文本文件的读取和写入

使用文件流对象打开文件后&#xff0c;文件就成为一个输入流或输出流。对于文本文件&#xff0c;可以使用 cin、cout 读写。 流的成员函数和流操纵算子同样适用于文件流&#xff0c;因为 ifstream 是 istream 的派生类&#xff0c;ofstream 是 ostream 的派生类&#xff0c;fs…

C++ 移动和获取文件读写指针

在读写文件时&#xff0c;有时希望直接跳到文件中的某处开始读写&#xff0c;这就需要先将文件的读写指针指向该处&#xff0c;然后再进行读写。 ifstream 类和 fstream 类有 seekg 成员函数&#xff0c;可以设置文件读指针的位置&#xff1b;ofstream 类和 fstream 类有 seekp…

程序设计基础——c语言篇,C语言程序设计基础篇.ppt

C语言程序设计基础篇C 语言程序设计—基础篇 第 2 章 数据类型和输入输出 2.1 数据类型 著名计算机科学家沃思提出&#xff1a; 程序&#xff1d;数据结构&#xff0b;算法 例如&#xff1a;学生各科成绩及总分排队问题。 成绩存放 –– 数据结构 排队方法 –– 算法 在此, 存放…

文件的文本打开方式和二进制打开方式的区别

在 UNIX/Linux 平台中&#xff0c;用文本方式或二进制方式打开文件没有任何区别。 在 UNIX/Linux 平台中&#xff0c;文本文件以\n&#xff08;ASCII 码为 0x0a&#xff09;作为换行符号&#xff1b;而在 Windows 平台中&#xff0c;文本文件以连在一起的\r\n&#xff08;\r的…

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

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

c语言中exchange函数,exchange

exchange描述 (Description)它原子地替换原子对象的值并获得先前保存的值。声明 (Declaration)以下是std :: atomic :: exchange的声明。T exchange( T desired, std::memory_order order std::memory_order_seq_cst );C11T exchange( T desired, std::memory_order order st…

C++ 流类和流对象

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

c语言float判断相等,c/c++ 比较两个浮点数相等

首先&#xff0c;两个 if 是一样的。浮点数和整数比较时&#xff0c;整数被转为浮点数。然后&#xff0c;i 为什么不等于 10.0&#xff1f;因为它只会等于这些值&#xff1a;>>> def gen():... i 0... while i < 10:... i 0.1... yield i...>>> L list…

C++ cout格式化输出

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

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

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

C++ 输出单个字符

在 C 程序中一般用 cout 和输出运算符 << 实现输出&#xff0c;cout 流在内存中有相应的缓冲区。但有时用户还有特殊的输出需求&#xff0c;例如只输出一个字符。 ostream 类除了提供上一节介绍过的用于格式控制的成员函数外&#xff0c;还提供了专门用于输出单个字符的…

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

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