(5)用户触发事件
所有事件具有相似的生命周期。调用libevent函数设置事件并且关联到event_base之后,事件进入“已初始化
(initialized)”状态。此时可以将事件添加到event_base中,这使之进入“未决(pending)”状态。
在未决状态下,如果触发事件的条件发生(比如说,文件描述符的状态改变,或者超时时间到达),则事件进
入“激活(active)”状态,(用户提供的)事件回调函数将被执行。
如果配置为“持久的(persistent)”,事件将保持为未决状态。否则,执行完回调后,事件不再是未决的。删除操
作可以让未决事件成为非未决(已初始化)的;添加操作可以让非未决事件再次成为未决的。
2.1 创建事件
使用event_new()接口创建事件。
event_new()试图分配和构造一个用于base的新事件。what参数是上述标志的集合。如果fd非负,则它是将被观察
其读写事件的文件。事件被激活时,libevent将调用cb函数,传递这些参数:文件描述符fd,表示所有被触发事件
的位字段,以及构造事件时的arg参数。
发生内部错误,或者传入无效参数时,event_new()将返回NULL。
struct event *event_new(struct event_base *base, evutil_socket_t fd,
short what, event_callback_fn cb, void *arg);
/*这个标志表示某超时时间流逝后事件成为激活的。超时发生时,回调函数的what参数将带有这个标志。*/
#define EV_TIMEOUT 0x01
/*表示指定的文件描述符已经就绪,可以读取的时候,事件将成为激活的。*/
#define EV_READ 0x02
/*表示指定的文件描述符已经就绪,可以写入的时候,事件将成为激活的。*/
#define EV_WRITE 0x04
#define EV_SIGNAL 0x08 //用于实现信号检测
#define EV_PERSIST 0x10 //表示事件是“持久的”
#define EV_ET 0x20 //表示如果底层的event_base后端支持边沿触发事件,则事件应该是边沿触发的。
这个标志影响EV_READ和EV_WRITE的语义。
typedef void (*event_callback_fn)(evutil_socket_t fd, short what, void * arg);
void event_free(struct event *event);