libevent解析1--运行架构
借着十一假期的休息,学习了libevent的源代码。libevent的相关内容在网上已经是多如牛毛,所以在这里就不做介绍了,本系列文章主要是按照自己的学习思路对libevent的运行方式做一个梳理。
首先,libevent是一个事件处理库,使用了Reactor模式的事件处理机制。事件作为libevent库的最基本单元在程序中经历了以下三步:
- 事件初始化;
- 事件注册到libevent中;
- 事件发生,libevent调用注册事件的回调函数;
- 所有事件执行完成,程序结束;
根据上面步骤,我们可以写出一个最简单的libevent程序:
/**
*源码来源:http://www.cnblogs.com/hustcat/archive/2010/08/31/1814022.html
*/
//回调函数
static void timeout_cb(int fd, short event, void *arg)
{
struct timeval tv;
struct event *timeout = arg;
int newtime = time(NULL);
printf("%s: called at %d: %d\n", "timeout_cb", newtime, newtime - lasttime);
lasttime = newtime;
evutil_timerclear(&tv);
tv.tv_sec = 2;
//重新注册event
event_add(timeout, &tv);
}
int main(int argc, char **argv) {
struct event timeout;
struct timeval tv;
/* Initalize the event library */
//初始化event环境
event_init();
/* Initalize one event */
//设置事件
evtimer_set(&timeout, timeout_cb, &timeout);
evutil_timerclear(&tv);
tv.tv_sec = 2;
//注册事件
event_add(&timeout, &tv);
lasttime = time(NULL);
//等待,分发,处理事件
event_dispatch();
return (0);
}
(源码的运行首先要安装了libevent库)
运行结果:
(源码来源:http://www.cnblogs.com/hustcat/archive/2010/08/31/1814022.html)
从上面的程序可以看出,完成一个调用libevent的程序只要四个步骤:
- 初始化libevent库:event_init()(其他相似API:event_base_set(), event_base_new());
- 建立一个事件:evtimer_set(&timeout, timeout_cb, &timeout)(其实是调用libevent的事件建立函数:void event_set(struct event *, evutil_socket_t, short, void (*)(evutil_socket_t, short, void *), void *);)
- 把事件注册到libevent库中:event_add(&timeout, &tv);
- libevent库进入循环,等待事件的发生和调用回调函数:event_dispatch();