Libevent特点:
- 跨平台支持。支持linux,unix,和windows.
- 统一事件源:对I/O事件,信号和定时事件提供统一的处理。
- 线程安全。使用libevent_pthreads库来提供线程安全支持。
- 基于Reactor模式的实现。
Reactor事件处理机制:
Reactor是一种事件驱动机制,有一个或多个并发的输入源(事件),有一个service handler, 有多个event handler. 具体过程就是应用程序需要提供相应的接口并注册到Reactor上,如果相应的事件发生,Reactor将主动调用应用程序注册的接口(回调函数)。
感性认识如下:
Reactor模式框架
基于Reactor模式的IO框架一般包含如下几个组件:
- 句柄(事件源):IO框架库要处理的对象,即IO事件,信号和定时事件。句柄的作用是,当内核检测到就绪事件时,它通过句柄来通知应用程序这一事件。Linux下IO事件对应文件描述符,信号事件则为相应的信号值。
- 事件多路分发器:由操作系统提供的I/O多路复用机制,如select和epoll。程序首先将其关心的句柄(事件源)及其事件注册到event demultiplexer上,当有事件到达时,event demultiplexer会发出通知“在已经注册的句柄集上,有一个或多个句柄的时事件已经就绪”,程序收到通知后,可以在非阻塞的情况下对事件进行处理。libevent使用结构体eventop对IO复用select,poll,epoll等进行封装,以统一接口来支持这些I/O多路复用机制,达到了对外隐藏底层系统机制的目的。
- Reactor:事件管理的接口,内部使用event demultiplexer注册,注销事件,并运行事件循环,当有事件进入“就绪”状态时,调用注册事件的回调函数处理事件。对于libevent的event_base结构体。
- Event Handler :对应于libevent的event结构体。提供了一组接口,每个接口对应一种类型事件,供Reactor在相应事件发生时调用,执行相应的事件处理。
使用libevent实例
#include <sys/signal.h>
#include <event2/event.h>
void signal_cb(int fd,short event,void *arg)
{
//do something
}
void event_cb(int fd,short event,void *arg)
{
//do something
}
int main()
{
struct event_base* base=event_new();
struct event* signal_event=evsignal_new(base,SIGINT,signal_cb,base);//信号
struct event* IO_event=event_new(base,fd,EV_READ,event_cb,base);//I/O事件
event_add(signal_event,NULL);
event_add(IO_event,NULL);
event_base_dispatch(base);
event_free(signal_event);
event_free(IO_event);
event_base_free(base);
}
步骤总结如下:
- 调用event_new() 初始化一个event_base实例(Reactor)
- 初始化事件event,设置回调函数和关注的事件。
- 调用event_add()注册关注的事件
- 程序调用event_base_dispatch()进入event_loop.