libevent是什么?
libevnet是一个事件驱动框架,提供一种处理机制,当fd有事件发生或超时时执行回调函数;同时libevent支持posix信号和普通超时回调。libevent的目标就是要取代事件驱动server的事件循环。应用仅仅需要调用event_dispatch(),接着就可以在不改变事件循环的情况下增加删除事件。libevent提供统一的event api来封装底层事件机制,比如select,poll,epoll,kqueue等。libevent可以使用在多线程环境中,一种方法是一个线程只能访问event_base,另一种方式是多个线程加锁访问一个event_base。libevent事件框架也是典型的Reactor模式,event封装了fd和fd事件处理函数,event_base处理多个event,对应Reactor。libevnet还是一个缓冲网络io的高级框架,支持sockets, filters, rate-limiting, SSL, zero-copy file transmission, and IOCP。libevent还支持几个有用的协议,包括dns,http,rpc框架。
之后的代码分析以libevent-1.4.14b-stable版本为准,底层多路复用机制分析epoll。
libevent源码分析,只专注于I/O读写事件和超时事件,对signal不做分析。
libevnet的事件框架和reids的事件框架类似。
libevent使用例子
1)首先初始化libevent库,并保存返回的指针
struct event_base * base = event_init();
实际上这一步相当于初始化一个Reactor实例;在初始化libevent后,就可以注册事件了。
2)初始化事件event,设置回调函数和关注的事件
event_set(&ev, -1, 0, timer_cb, NULL);
event_set的函数原型是:void event_set(struct event *ev, int fd, short event, void (*cb)(int, short, void *), void *arg)
ev:执行要初始化的event对象;
fd:该event绑定的“句柄”,对于信号事件,它就是关注的信号;
event:在该fd上关注的事件类型,它可以是EV_READ, EV_WRITE, EV_SIGNAL;
cb:这是一个函数指针,当fd上的事件event发生时,调用该函数执行处理,它有三个参数,调用时由event_base负责传入,按顺序,实际 上就是event_set时的fd, event和arg;
arg:传递给cb函数指针的参数;
这一步相当于设置fd,对fd要关注的事件,事件的处理函数;
3)设置event从属的event_base
event_base_set(base, &ev);
这一步相当于指明event要注册到哪个event_base实例上;
4)添加事件,底层调用epoll_ctl
event_add(&ev, timeout); // timeout是定时值;
5)程序进入无限循环,等待就绪事件并执行事件处理,底层调用epoll_wait
event_base_dispatch(base);
参考:
官方网站:http://libevent.org/
书籍programming with libevent:http://www.wangafu.net/~nickm/libevent-book/