libevent是一个事件触发的网络库,适用于windows、linux、bsd等多种平台,内部使用select、epoll、kqueue等系统调用管理事件机制。著名分布式缓存软件memcached也是libevent based,并且libevent在使用上能够作到跨平台,并且根据libevent官方网站上公布的数据统计,彷佛也有着非凡的性能。php
例如 : 客户端链接到服务端属于一个链接的事件,当这个事件触发的时候就会去处理。linux
event_base是event的一个集合,主要是用来管理和实现事件的监听循环。通常状况下一个线程一个event_base,多个线程的状况下须要开多个event_base。windows
建立event_base 缓存
struct event_base *event_base_new(void);
销毁event_base网络
void event_base_free(struct event_base *base);
初始化event_basesocket
int event_reinit(struct event_base *base);
销毁event_base分布式
void event_base_free(struct event_base *base);
IO多路复用模型中 (IO模型文章),有多种方法能够供咱们选择,可是这些模型是在不一样的平台下面的: select poll epoll kqueue devpoll evport win32memcached
当咱们建立一个event_base的时候,libevent会自动为咱们选择最快的IO多路复用模型,Linux下通常会用epoll模型。函数
获取io多路复用模型名称oop
const char *event_base_get_method(const struct event_base *base);
事件循环监听event_loop event_base是须要监听的event事件集合,须要循环被监听
监听函数
int event_base_dispatch(struct event_base *base);
int event_base_loop(struct event_base *base, int flags);
event事件
even_base中的基本单元,事件。
例如 socket进行网络开发的时候,都会使用accept这个方法来阻塞监听是否有客户端socket链接上来,若是客户端链接上来,则会建立一个线程用于服务端与客户端进行数据的交互操做,而服务端会继续阻塞等待下一个客户端socket链接上来,客户端链接到服务端实际就是一种事件。
建立event
struct event *event_new(struct event_base *base, evutil_socket_t fd,short what, event_callback_fn cb,void *arg);
参数:
1. base:即event_base
2. fd:文件描述符。
3. what:event关心的各类条件。
4. cb:回调函数。
5. arg:用户自定义的数据,能够传递到回调函数中去。
libevent是基于事件的,也就是说只有在事件到来的这种条件下才会触发当前的事件。例如:
1. fd文件描述符已准备好可写或者可读
2. fd立刻就准备好可写和可读。
3. 超时的状况 timeout
4. 信号中断
5. 用户触发的事件
void event_free(struct event *event);
int event_add(struct event *ev, const struct timeval *tv);
// base --- event_base // signum --- 信号,例如 SIGHUP // callback --- 信号出现时调用的回调函数 // arg --- 用户自定义数据 evsignal_new(base, signum, cb, arg) //将信号 event 注册到 event_base evsignal_add(ev, tv) // 清理信号 event evsignal_del(ev)
1. 每个事件event都须要经过event_new初始化生成。event_new生成的事件是在堆上分配的内存。
2. 当一个事件经过event_add被注册到event_base上的时候,这个事件处于pending(等待状态),当只有有事件进来的时候,event才会被激活active状态,相关的回调函数就会被调用。
3. persistent 若是event_new中的what参数选择了EV_PERSIST,则是持久的类型。持久的类型调用玩回调函数后,会继续转为pending状态,就会继续等待事件进来。大部分状况下会选择持久类型的事件。
3. 而非持久的类型的事件,调用玩一次以后,就会变成初始化的状态。这个时候须要调用event_add 继续将事件注册到event_base上以后才能使用。