【Linux系统编程】libevent库事件驱动
libevent库事件驱动
libevent库使用
- 创建并初始化
event_base
结构体。 - 创建并初始化
event
结构体,并设置文件描述符、监听事件、回调函数、回调函数参数。 - 将
event
添加到event_base
中。 - 开始事件处理循环,监听事件是否发生,并在满足条件时自动调用回调函数。
- 事件处理完成后,释放
event
结构体的内存空间。 - 全部事件处理完成后,释放
event_base
结构体的内存空间。
相关函数
event_new()
函数说明
初始化event
结构体。
函数原型
#include <event.h>
#include <event2/event.h>
struct event* event_new(struct event_base *base,
evutil_socket_t fd,
short events,
event_callback_fn callback,
void *callback_arg);
函数参数
struct event_base *base
:event
将被添加到哪一个event_base
上evutil_socket_t fd
:要监听的文件描述符short events
:要监听的事件#define EV_TIMEOUT 0x01
:超时事件#define EV_READ 0x02
:读事件#define EV_WRITE 0x04
:写事件#define EV_SIGNAL 0x08
:信号事件#define EV_PERSIST 0x10
:周期性触发#define EV_ET 0x20
:边缘触发,需要底层事件I/O方法支持
event_callback_fn callback
:回调函数- 回调函数定义:
typedef void(* event_callback_fn) (evutil_socket_t, short, void *)
evutil_socket_t fd
:监听的文件描述符,与event_new
中的fd
相同short events
:监听的事件,与event_new
中的events相同void *arg
:回调函数的参数
- 回调函数定义:
void *callback_arg
:要传递给回调函数的参数
函数返回值
struct event*
- 成功返回初始化的
event
结构体指针 - 失败返回
nullptr
- 成功返回初始化的
event_add()
函数说明
将event
添加到event_base
监听集合。
函数原型
#include <event.h>
#include <event2/event.h>
int event_add (struct event *ev,
const struct timeval *timeout);
函数参数
struct event *ev
:要添加的event
结构体const struct timeval *timeout
:事件监听的超时时间struct timeval { long tv_sec; long tv_usec;};
long tv_sec
:秒long tv_usec
:微秒
函数返回值
int
- 成功返回0
- 失败返回-1
event_del()
函数说明
将event
从event_base
监听移除。
函数原型
#include <event.h>
#include <event2/event.h>
int event_del(struct event *ev);
函数参数
struct event *ev
:要删除的event
结构体
函数返回值
int
- 成功返回0
- 失败返回-1
event_free()
函数说明
释放event
结构体内存空间
函数原型
#include <event.h>
#include <event2/event.h>
void event_free(struct event *);
函数参数
struct event *
:要释放空间的event
结构体指针
event_base_loop()
函数说明
开始事件监听循环。
函数原型
#include <event.h>
#include <event2/event.h>
int event_base_loop(struct event_base *eb, int flags);
函数参数
struct event_base *eb
:要开始监听的event_base
结构体int flags
:监听方式的标志- 0:不设置标志位,默认处理方式,如果
event_base
中没有需要监听的事件则退出循环,或者被函数中止 #define EVLOOP_ONCE 0x01
:阻塞等待事件满足,处理完所有满足条件的事件后,函数返回#define EVLOOP_NONBLOCK 0x02
:非阻塞处理满足条件的事件,如果没有满足条件的事件,直接返回,否则处理完所有事件后返回#define EVLOOP_NO_EXIT_ON_EMPTY 0x04
:一直循环监听,即使监听事件集合为空也不退出,直到被函数中止
- 0:不设置标志位,默认处理方式,如果
函数返回值
int
- 正常退出返回0
- 出错返回-1
event_base_dispatch()
函数说明
相当于event_base_loop(eb, 0)
,使用默认处理方式监听处理事件。
函数原型
int event_base_dispatch(struct event_base *base);
event_base_loopexit()
函数说明
退出事件监听循环,该函数在等待下一次超时后,处理所有激活的事件,然后退出循环。
函数原型
#include <event.h>
#include <event2/event.h>
int event_base_loopexit(struct event_base *eb, const struct timeval * tv);
函数参数
struct event_base *eb
:要退出监听循环的event_base
结构体指针const struct timeval * tv
:等待退出循环的超时时间
函数返回值
int
- 正常退出返回0
- 出错返回-1
event_base_loopbreak()
函数说明
立即退出事件监听循环,在处理完目前的事件后立即退出循环。
函数原型
#include <event.h>
#include <event2/event.h>
int event_base_loopbreak(struct event_base *eb);
函数参数
struct event_base *eb
:要退出监听循环的event_base
结构体指针
函数返回值
int
- 正常退出返回0
- 出错返回-1