开源的事件通知库,主要用来处理网络通信,文件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的超时时间。

更多推荐