libevent简介
Libevent官方网站
高性能分布式内存对象缓存软件memcached、Google Chromium Linux版等均使用Libevent作为I/O框架库。
libevent具有的特点:(1)跨平台;(2)统一事件源;(3)线程安全;(4)基于Reactor模式的实现。
基于centos7(建议)安装libevent-2.1.8版本。安装步骤如下。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| install_build_essential(){ yum install -y make yum install -y automake yum install -y gcc yum install -y gcc-c++ yum install -y kernel-devel yum install -y libtool }
install_libevent(){ tar -zxvf libevent-2.1.8-stable.tar.gz mv libevent-2.1.8-stable /usr/local/lib/libevent-2_1_8-stable /usr/local/lib/libevent-2_1_8-stable/autogen.sh /usr/local/lib/libevent-2_1_8-stable/configure make -I /usr/local/lib/libevent-2_1_8-stable/ make install -I /usr/local/lib/libevent-2_1_8-stable/ make clean -I /usr/local/lib/libevent-2_1_8-stable/ cp /usr/local/lib/libevent-2.1.so.6 /usr/lib64/ }
install_build_essential install_libevent
|
注:对于使用了libevent框架库的源代码,使用gcc编译时要加上-levent选项。
libevent主要函数
event_init
创建event_base对象;一个event_base对象可视为一个Reactor实例;
ev*_new系列函数
创建相应事件的事件处理器;evsignal_new创建信号事件处理器;evtimer_new创建定时事件处理器;ev*_new系列函数定义在libevent源码的include/event2/event.h文件中。
1 2 3 4
| #define evsignal_new(b, x, cb, arg) \ event_new((b), (x), EV_SIGNAL|EV_PERSIST, (cb), (arg))
#define evtimer_new(b, cb, arg) event_new((b), -1, 0, (cb), (arg))
|
由此可知,ev*_new系列函数统一调用event_new函数,而event_new函数即用来创建通用事件处理器。event_new函数定义如下。
1 2 3 4 5 6 7 8 9 10
|
struct event * event_new(struct event_base * base, int fd, short events, event_callback_fn cb, void * arg);
|
事件由多路分发器管理,事件处理器则由事件队列管理。事件队列有多种:event_base中的注册事件队列、活动事件队列、通用定时器队列、evmap中的I/O事件队列、信号事件队列。
event_add函数
将事件处理器添加到注册事件队列中,并将该事件处理器对应的事件添加到事件多路分发器中。
event_base_dispatch函数
执行事件循环。
event*_free系列函数
event_free释放event对象;event_base_free释放event_base对象。