简介
libevent 库的使用少不了event_base和event
创建一个event_base
struct event_base* event_base_new(viod);
释放evnet_base
event_base_free(struct event_base* base);
创建事件
struct event *event_new(
struct event_base* base,
evutil_socket_t fd,
short what,
event_callback_fn cb,
void *arg
);
调用event_new()函数之后, 新事件处于已初始化和非未决状态
有关于未决态和非未决态的理解:
- 非未决: 没有资格被处理
- 未决: 有资格被处理但是还没有处理
条目 | 解释 |
---|---|
base: | event_base_new()返回值。 |
fd: | 绑定到 event 上的 文件描述符 |
what: | 对应的事件(r、w、e) |
cb: | 一旦事件满足监听条件,回调的函数。 |
arg: | 回调的函数的参数。 |
返回值: | 成功创建的 event |
回调函数
// 事件的处理回调函数
typedef void (*event_callback_fn)(evutil_socket_t, short, void *);
// short what
#define EV_TIMEOUT 0x01 // 已淘汰(忽略)
#define EV_READ 0x02
#define EV_WRITE 0x04
#define EV_SIGNAL 0x08 //libevent封装了信号相关的操作 SIGNAL
#define EV_PERSIST 0x10 // 持续触发
#define EV_ET 0x20 // 边沿模式
event 的释放
void event_free(struct event *event);
event_add
创建事件之后,在将其添加到 event_base 之前实际上是不能对其做任何操作的。
使用event_add()将事件添加到event_base
int event_add(
struct event *ev,
const struct timeval *tv
);
tv:参数 | Value |
---|---|
NULL: | 事件被触发, 对应的回调被调用 |
tv = {0, n} | 设置的时间,在改时间段内检测的事件没被触发, 时间到达之后, 回调函数还是会被调用 |
添加事件循环
int event_base_dispatch(struct event_base* base);
等同于没有设置标志的 event_base_loop ( ),将一直运行,直到没有已经注册的事件了,或者调用 了event_base_loopbreak()或者 event_base_loopexit()为止
// event_base_loop()
int event_base_loop(struct event_base *base, int flags);
//正常退出返回0, 失败返回-1
//flages
#define EVLOOP_ONCE 0x01
//事件只会被触发一次
//事件没有被触发, 阻塞等
#define EVLOOP_NONBLOCK 0x02
//非阻塞 等方式去做事件检测
//不关心事件是否被触发了
#define EVLOOP_NO_EXIT_ON_EMPTY 0x04
//没有事件的时候, 也不退出轮询检测
退出事件循环
可以选择执行完当前事件后退出还是立即退出循环。
执行完当前事件后退出:
int event_base_loopexit(
struct event_base *base,
const struct timeval *tv
);
struct timeval {
long tv_sec;
long tv_usec;
};
立即退出循环
int event_base_loopbreak(struct event_base *base);
使用流程
创建event_base
struct event_base* base=event_base_new();
创建event
struct event ev=event_new(base,fd,EV_WRITE,write_cb,NULL);
添加event
event_add(ev,NULL);
event_base添加事件循环
event_base_dispatch(base);
释放event
event_free(ev);
释放event_base
event_base_free(base);
注:其中fd是需要监听的文件描述符,有写事件时触发写事件回调函数。