libevent
开源的事件通知库,主要用来处理网络通信,文件I/O,信号等事件,在高并发,高性能场景中适用,支持多种I/O复用方式,根据不同的操作系统选择最优方案
特点:
1.跨平台
2.事件驱动:基于事件循环模型,通过注册回调函数处理各种事件(可读,可写,超时,错误)
3.高性能:支持多种I/O复用方式,根据不同的操作系统选择最优方案
4.轻量级:代码简洁,依赖少
libevent 初始化
event_init():用于初始化事件库,并创建默认事件基础(event_base)的函数。旧版本event_base_new()新版本
作用
1.初始化libevent库的内部状况(创建默认线程,创建随机数)
2.创建一个默认的event_base对象(事件循环的核心),并将其设置为当前线程的全局事件基础
3.返回一个默认的event_base指针
创建触发信号和超时时间指针
由evsignal_new()和evtimer_new()
ensignal_new()
是一个创建信号事件的专用函数,主要用于监听和处理操作系统的信号,它是通用事件创建函数event_new()封装来的。
信号事件对象由evsignal_new创建的默认是永久事件
struct event* evsignal_new(struct event_base* base, int signum, void(*cb)(evutil_socket_t, short, void*), void* arg)
struct event_base* base
信号事件所属的event_base(事件基础)
int signum
要监听的信号编号
cd
信号触发时调用的回调函数
evutil_socket_t:一般忽略
short:事件的类型(固定填EV_SIGNAL)
void*:用户传入的自定义数据
arg
传给回调函数的自定义数据
返回值
成功:返回创建的信号事件的对象
失败:返回NULL
evtimer_new()
是一个超时事件的专用函数,主要用于监听和处理超时时间,它是通用事件创建函数event_new()封装来的。
超时事件对象由evtimer_new创建的默认是一次性事件
如果想将某个一次性事件设置为永久事件,可以修改该事件的属性。
struct event* evtimer_new(struct event_base* base, void(*cb)(evutil_socket_t, short, void*), void* arg)
struct event_base* base
超时时间所属的event_base
cb
超时时触发的回调函数
evutil_socket_t:忽略
short:固定EV_TIMEOUT
void*:用户传递的自定义数据
arg*
传递给回调函数的自定义数据
返回值
成功:返回创建的超时事件对象 struct event*
失败:返回NULL
event_add()
用于将事件(struct event)注册到事件基础(event base),让event_base开始监听该事件的触发条件,当触发条件满足时,事件对应的回调函数会被执行
int event_add(struct event *ev, const struct timeval *timeout)
ev
要添加的事件对象(通过event_new创建)
timeout
超时时间,NULL表示事件仅在触发条件满足时触发
具体的值:表示超时后会触发该事件
核心思路
1.将事件从“未监听状态”转为“监听中”,使对应事件被event_base事件循环管理
2.若设定超时时间,event_base会同时监听事件的触发条件和超时信号,确保在超时前未触发,也能执行回调函数
3.可以对已经添加到事件循环中的事件重新设定
event_base_dispatch()
启动事件循环,开始监听所有添加的事件,直到没有活跃事件或被手动终止
int event_base_dispatch(struct event_base * base)
base
已经初始化的event_base对象(事件循环载体)
返回值
成功且没有活跃事件:返回1
失败:返回-1(初始化失败 被信号中断)
核心作用
1.等待时间就绪,通过底层的多路I/O复用等待注册事件的发生
2.处理就绪事件:按优先级调用所有就绪事件的回调函数
3.检查退出条件:若没有活跃事件(即所有的事件都已经被删除或者触发后未重新添加)
事件类型
EV_READ
文件描述符可读
EV_WRITE
文件描述符可写
EV_RDWR
文件描述符可读可写
EV_SIGNAL
信号事件,关联一个信号编号
EV_TIMEOUT
超时事件,无需关联文件描述符
EV_PERSIST
持续事件(并不是事件类型,而是修饰事件的行为)
当被修饰的事件触发时,不会从事件核心(event_base)中移除,需要手动调用event_del()或者event_free()移除。
适用场景
对于I/O事件
持续化监听文件描述符的读写状态,每次就绪会触发回调。
对于超时事件
可以周期性的触发超时事件,每次都会按照event_add的超时时间触发,如果需要修改触发周期,则需要修改event_add的超时时间。
更多推荐

所有评论(0)