文章目录
  1. libevent简介
  2. libevent主要函数
    1. event_init
    2. ev*_new系列函数
    3. event_add函数
    4. event_base_dispatch函数
    5. event*_free系列函数

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
/*
引用方式: #include <event.h>
base: 创建的事件处理器从属的Reactor
fd: 与该事件处理器关联的句柄; 对I/O事件: 文件描述符 || 对信号事件: 信号值 || 对定时事件: -1
events: 指定事件类型; EV_TIMEOUT: 定时事件 || EV_READ: 可读事件 || EV_WRITE: 可写事件 || EV_SIGNAL: 信号事件 || EV_PERSIST: 永久事件 || EV_ET: 边沿触发事件
cb: 回调函数
arg: 传递给cb函数的参数
返回值: event对象(即事件处理器)
*/
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对象。