libevent介绍
1 事件驱动, 高性能, 轻量级, 专注于网络
2 源代码精炼, 易读
3 跨平台
4 支持多种I/O多路复用技术, 如epoll select poll等
5 支持I/O和信号等事件
libevent的核心实现:
在linux上, 其实质就是epoll反应堆.
libevent是事件驱动, epoll反应堆也是事件驱动, 当要监测的事件发生的时候, 就会调用事件对应的回调函数, 执行相应操作. 特别提醒: 事件回调函数是由用户开发的, 但是不是由用户显示去调用的, 而是由libevent去调用的.
libevent的地基-event_base
使用libevent 函数之前需要分配一个或者多个 event_base 结构体, 每个event_base结构体持有一个事件集合, 可以检测以确定哪个事件是激活的, event_base结构相当于epoll红黑树的树根节点, 每个event_base都有一种用于检测某种事件已经就绪的 “方法”(回调函数)
通常情况下可以通过event_base_new函数获得event_base结构。
下面介绍一些常用函数:
相关函数说明:
1 struct event_base *event_base_new(void); //event.h的L:337
函数说明: 获得event_base结构
参数说明: 无
返回值:
成功返回event_base结构体指针;
失败返回NULL;
2 void event_base_free(struct event_base *); //event.h的L:561
函数说明: 释放event_base指针
3 int event_reinit(struct event_base *base); //event.h的L:349
函数说明: 如果有子进程, 且子进程也要使用base, 则子进程需要对event_base重新初始化, 此时需要调用event_reinit函数.
函数参数: 由event_base_new返回的执行event_base结构的指针
返回值: 成功返回0, 失败返回-1
对于不同系统而言, event_base就是调用不同的多路IO接口去判断事件是否已经被激活, 对于linux系统而言, 核心调用的就是epoll, 同时支持poll和select.
查看libevent支持的后端的方法有哪些:
const char **event_get_supported_methods(void);
函数说明: 获得当前系统(或者称为平台)支持的方法有哪些
参数: 无
返回值: 返回二维数组, 类似与main函数的第二个参数**argv.
const char * event_base_get_method(const struct event_base *base);
函数说明: 获得当前base节点使用的多路io方法
函数参数: event_base结构的base指针.
返回值: 获得当前base节点使用的多路io方法的指针
使用libevent库的步骤:
1 创建根节点–event_base_new
2 设置监听事件和数据可读可写的事件的回调函数
设置了事件对应的回调函数以后, 当事件产生的时候会自动调用回调函数
3 事件循环–event_base_dispatch
相当于while(1), 在循环内部等待事件的发生, 若有事件发生则会触发事件对应的回调函数。
4 释放根节点–event_base_free
释放由event_base_new和event_new创建的资源, 分别调用event_base_free
和event_free函数.
事件驱动-event
事件驱动实际上是libevent的核心思想, 本小节主要介绍基本的事件event。
主要的状态转化: