一、基础流程
1. 创建 event_base (乐高底座)
struct event_base *event_base_new(void);
struct event_base *base = event_base_new();
2. 创建 事件evnet
常规事件 event --> event_new();
bufferevent --> bufferevent_socket_new();
3、将事件 添加到 base上
int event_add(struct event *ev, const struct timeval *tv)
4. 循环监听事件满足
int event_base_dispatch(struct event_base *base);
event_base_dispatch(base);
5.释放 event_base
event_base_free(base);
二、函数
前面要创建一个底座
1、创建事件event:
这里指定了是哪个底座,也就是指定了在哪个底座上创建,更像一棵树创建了一个节点,但连接这个节点的线是虚的,在下面的函数哪里,才把线连上。
struct event *ev;
struct event *event_new(struct event_base *base,evutil_socket_t fd,short what,event_callback_fn cb; void *arg);
base: event_base_new()返回值。一个底座
fd: 绑定到 event 上的 文件描述符
what:对应的事件(r、w、e)
EV_READ 一次 读事件
EV_WRTIE 一次 写事件
EV_PERSIST 持续触发。 结合 event_base_dispatch 函数使用,生效。
cb:一旦事件满足监听条件,回调的函数。
typedef void (*event_callback_fn)(evutil_socket_t fd, short, void *)
arg: 回调的函数的参数。
返回值:成功创建的 event
2、添加事件到 event_base
这里并没有指明是哪个底座,由于这个事件本身已经指定了在哪里创建,因此也不需要指明是哪个。
int event_add(struct event *ev, const struct timeval *tv);
ev: event_new() 的返回值。
tv:NULL,这个是时间
3、从event_base上摘下事件【了解】
int event_del(struct event *ev);
ev: event_new() 的返回值。
4、销毁事件
int event_free(struct event *ev);
ev: event_new() 的返回值。
未决和非未决
非未决: 没有资格被处理
未决: 有资格被处理(但是事件还没有到达),但尚未被处理
激活态:事件到达,还没有处理