Libevent 定时器

先摘一点网上的介绍

libevent是一个事件触发的网络库,适用于windows、linux、bsd等多种平台,内部使用select、epoll、kqueue等系统调用管理事件机制。著名分布式缓存软件memcached也是libevent based,而且libevent在使用上可以做到跨平台,而且根据libevent官方网站上公布的数据统计,似乎也有着非凡的性能。

接着我们先直接看一个例子,该例子每隔几秒输出一个句子

#include <iostream>
#include <event.h>
#include <ctime>

using namespace std;

void cb(evutil_socket_t fd, short what, void *arg)
{
    cout<<"event ocurrence every 2 seconds."<<endl;
}

int main()
{
    timeval two_sec = {2, 0};
    event_base *base = event_base_new();
    event *timeout = event_new(base, -1, EV_PERSIST|EV_TIMEOUT, cb, NULL);
    event_add(timeout, &two_sec);
    event_base_dispatch(base);
    return 0;
}

event_base是libevent中的基本数据结构,该结构进行事件的调度,这里用event_config_new (void)函数new了一个event_base变量。event结构libevent里另外一个重要的数据结构,它保存着有关事件发生的各种信息,比如io事件的文件描述符,发生时调用的回调函数等。本例中我们定义了一个定时器事件,使用event_new (event_base *, evutil_socket_t, short, event_callback_fn, void *)创建了一个定时器事件,该函数第一个参数为调度该事件的event_base结构;第二个参数为io事件对应的文件描述符,这里为定时器事件没有fd所以定位-1,如果要定义signal事件,该参数就是信号的标志;第三个参数为事件event flags,可以以下几个及其合并EV_READ(io),EV_WRITE(io),EV_SIGNAL(信号),EV_PERSIST(存在该标志则事件发生后event_base将其重新添加到pending中),EV_ET, EV_TIMEOUT,根据程序要求选用EV_PERSIST|EV_TIMEOUT,就是重复定时。libevent中的事件有几种状态:no-pend&no-active,pending,active;刚刚建立的event为第一种状态,使用event_add(event*, time_val)将其变成pending状态,这样event_base进行事件调度时才会执行该事件,该函数第二参数为timeout时间,这里取2s。最后将进行event_base事件循环,event_base_dispatch。

使用libevent进行网络编程的话大概也就是这个流程。

Libevent 定时器

时间: 2024-10-16 14:32:54

Libevent 定时器的相关文章

libevent 定时器timer

libevent是一个基于事件触发的网络库,memcached底层也是使用libevent库. 总体来说,libevent有下面一些特点和优势:* 事件驱动,高性能:* 轻量级,专注于网络: * 跨平台,支持 Windows.Linux.Mac Os等: * 支持多种 I/O多路复用技术, epoll.poll.dev/poll.select 和kqueue 等: * 支持 I/O,定时器和信号等事件: libevent有下面几大部分组成: * 事件管理包括各种IO(socket).定时器.信号

libevent安装与libevent定时器

主要是参考了一下网上的方法,http://blog.sina.com.cn/s/blog_4b93170a0100mbm9.html 并自己实际操作了一下,针对自己出现的一些情况进行说明.并在实际编译链接过程中进行实践. 这些其实都是一些基本的简单操作,但是对于我这种菜鸟级别的小白来说,还是挺好的,高手请口下留情. 本文主要针对mac系统,对linux系统也适用. 首先从libevent的官网(http://libevent.org)中下载压缩包,这里我下的是到目前为止最新的版本,libeven

定时器管理:nginx的红黑树和libevent的堆

libevent 发生超时后, while循环一次从堆顶del timer——直到最新调整的最小堆顶不是超时事件为止,(实际是del event),但是会稍后把这个timeout的 event放到active 任务list里, 等待处理,event标记为timeout,等处理actvie队列时再由应用层callback函数决定怎么处理标记为timeout的事件. nginx处理超时时,直接删除红黑树中( event结构体里的 )rb node成员,同时调用应用层早已通过add timer注册好的

libevent timer定时器

每隔一秒循环执行回调函数 #include <iostream> #include <event2/event.h> struct cb_arg { struct event *ev; struct timeval tv; }; void timeout_cb(int fd, short event, void *params) { puts("111"); struct cb_arg *arg = (struct cb_arg*)params; struct

libevent::事件::定时器2

#define evtimer_new(b, cb, arg) event_new((b), -1, 0, (cb), (arg)) #include <cstdio> #include <errno.h> #include <sys/types.h> #include <event.h> #include <event2/event.h> #include <event2/event_struct.h> #include <e

浅谈libevent的使用--事件和数据缓冲

首先在学习libevent库的使用前,我们还要从基本的了解开始,已经熟悉了epoll以及reactor,然后从event_base学习,依次学习事件event.数据缓冲Bufferevent和数据封装evBuffer等,再结合具体的几个实例来了解libevent库的一些基本使用,有助于我们理解它的一些内部实现(由于之前我已经写过一篇epoll反应堆模型的,所以这里就不再介绍,直接从event_base开始介绍). libevent下载与安装: 在官网上找到 libevent-2.0.22-sta

libevent for qt的讨论

一直对Qt官方的QtNetwork模块抱有遗憾,Qt自带的网络模块用的是select模型,无法支持高并发的服务器开发.最近在网上看到有个libevent for qt的东西,它直接替换了Qt的select模型,支持epoll模型,所以就支持高并发了.这东西好啊,弥补了Qt的不足,也弥补了我的遗憾.我兴致勃勃的从网上下载了源代码(github地址:https://github.com/sjinks/qt_eventdispatcher_libevent),然后在windows上编译,结果每次都报错

Libevent源码分析-timer和signal处理

timer处理 Signal处理 timerfd和signalfd timerfd signalfd timer处理 在Libevent源码分析-event处理流程中,使用了定时器,来看一下源码: evtimer_set(&ev, time_cb, NULL);//设置定时器事件 其中evtimer_set是个宏定义 #define evtimer_set(ev, cb, arg) event_set((ev), -1, 0, (cb), (arg)) //event_set原型 void ev

libevent源码分析-event

event结构 event相关接口 Libevent对event的管理 event结构 event是Reactor模式中的最重要的组件.它包含了了一个句柄fd,并设置监听这个句柄上的哪些事件(读/写等),设置了对应的函数指针,在事件到来时,回调函数指针来处理事件. 先看一下event的结构.它位于include/event2/event_struct.h中 struct event { TAILQ_ENTRY(event) ev_active_next; TAILQ_ENTRY(event) e