09. 看源码
常用的API方法原型
event_new(初始化上树节点)
初始化上树节点
/**
分配和分配一个新的事件结构,准备添加。
函数event_new()返回一个新事件,该事件可用于将来调用event_add()和event_del()。fd和事件参数决定哪些条件将触发事件;的
callback和callback_arg参数告诉Libevent在事件变为活动状态。
如果事件包含EV_READ, EV_WRITE或EV_READ中的一个,则
Fd是一个应该被监视的文件描述符或套接字
准备好读,准备好写,或准备好进行任一操作
(分别)。如果events包含EV_SIGNAL,则fd是一个信号
等待的号码。如果事件不包含这些标志,则
事件只能通过超时或手动激活来触发
event_active():在这种情况下,fd必须为-1。
EV_PERSIST标志也可以在events参数中传递
Event_add()一直持续到event_del()被调用。
EV_ET标志与EV_READ和EV_WRITE标志兼容,并且支持
只有特定的后端。它告诉Libevent使用edge-triggered
事件。
EV_TIMEOUT标志在这里没有作用。
在同一个fds上监听多个事件是可以的;但
它们要么都是边缘触发的,要么根本不是边缘触发的。
当事件变为活动状态时,事件循环将运行提供的
回调函数,带有三个参数。第一个将被提供
fd的价值。第二个将是触发事件的位域:
EV_READ, EV_WRITE或EV_SIGNAL。这里EV_TIMEOUT标志表示
表示超时,EV_ET表示边缘触发
事件发生。第三个事件将是callback_arg指针
你提供的。
@param {event_base} base 根节点,事件要被添加到的事件管理器
@param {evutill_socket_t} fd 要被添加到树的节点。即要监视的文件描述符或信号,或-1
@param {short} events 需要监控的事件: 可设置为:
EV_READ, 0x01,文件描述符可读时 (有数据可读了)
EV_WRITE, 0x02,文件描述符可写时
EV_SIGNAL, 0x04,信号事件。信号事件用于处理操作系统发送给程序的信号,如 `SIGINT`、`SIGTERM` 等
EV_PERSIST, 0x08,表示事件是持久。设置后在回调函数执行后,事件将保持活跃状态并继续监听
EV_ET, 0x10,表示事件是边缘触发的。
@param {event_callback_fn} 要调用的回调函数
@param {void*} 给回调函数的参数
@return 一个新分配的结构体事件,如果发生错误,必须稍后用event_free()或NULL释放它。
@see event_free(), event_add(), event_del(), event_assign()
*/
EVENT2_EXPORT_SYMBOL
struct event *event_new(
struct event_base *base,
evutil_socket_t fd,
short events,
event_callback_fn callback,
void *callback_arg);
/**
* event的回调函数
* @param {evutill_socket_t} fd 一个文件描述符或信号
* @param {short} events EV_* flags 的参数,详见 event_new 注释
* @param {void*} arg 用户提供的参数。
* @see event_new()
*/
typedef void (*event_callback_fn)(evutil_socket_t, short, void *);
补充:里面提到的
边缘触发
是什么意思边缘触发事件与水平触发事件相反。水平触发事件是默认的触发模式,这意味着只要条件满足(如有数据可读或可写),事件就会不断触发。然而,边缘触发事件仅在条件从不满足变为满足时触发。因此,在边缘触发模式下,当底层的文件描述符准备好进行读或写操作时,只会触发一次事件,即使仍有数据可读或有更多空间可写。
event_add(节点上树)
节点上树
/**
* @param ev,上树节点的地址
* @param timeout, 限时时间,NULL则为永久监听
*/
int event_add(struct event* ev, const struct timeval* timeout);
event_del(节点下树)
节点下树
/**
* @param ev,下树节点的地址
*/
int event_del(struct event* ev);
event_free(释放节点)
void event_free(struct event* ev)
链接到当前文件 0
没有文件链接到当前文件