代码拉取完成,页面将自动刷新
一个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, rb);
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 <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#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;
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。