前言
在分析libevent之前, 先对整个libevent的文件结构有一个基本的了解才行, 有了整体的了解才能清楚每个功能的位置.
文件结构
-
事件的头文件
- event.h : 事件类型的宏定义, 接口函数的声明, 以及最重要的
event
,event_base
以及evbueffer
,bufferevent
结构体, 其中evbuffer
结构的功能在函数evbuffer.c
中实现
- event.h : 事件类型的宏定义, 接口函数的声明, 以及最重要的
-
事件的框架
- event.c : 对
event
整个结构的实现. 这也是libevent的核心, 融合整个libevent框架.
- event.c : 对
-
对IO多路复用的封装
- epoll.c : 对
epoll
的封装. (我们主要分析epoll封装的实现, 其他的有兴趣的可考虑看一下) - select.c : 对
select
的封装 - poll.c : 对
poll
的封装 - kqueue.c : 对
kqueue
的封装
- epoll.c : 对
-
定时器的事件管理
- min-heap.h : 以时间作为键值的的小根堆结构.
- evutil.c : 对时间的其他实现.
-
信号的事件管理
- evsignal.h : 定义了
evsignal_intfo
结构体, 主要用于信号接口的声明, 管理. - evsignal.c : 定义了信号的各种接口, 信号的功能 : 信号初始化, 信号注册, 信号加入就绪队列, 信号删除,注销等.
- evsignal.h : 定义了
-
缓冲区管理. libevent自己内部设置了 一个缓冲区管理机制, 运行后都是自动化管理的
- event.h : 定义了
evbuffer
,bufferevnt
结构体. - bufferevent : 对缓冲区实现, 读写事件的处理
- evbuffer.c : 对实现缓冲区的自动化管理, 加入自动加入就绪队列,删除等.
- event.h : 定义了
-
日志
- log.h和log.c : 实现日志的管理
-
基础数据结构
- compat/sys/queue.h : 链表的数据结构的实现(有兴趣可以看一下, 都是宏定义, 看起来有点绕)
-
测试代码
- test和sample目录中 : 检测libevent的安装
-
辅助功能函数
- evutil.h 和evutil.c:一些辅助功能函数, 包括创建socket pair和一些时间操作函数 : 加、减和比较等
-
实用网络库
- http和evdns : 是基于libevent实现的http服务器和异步dns查询库
流程
当然上面说的功能有很多, 但是我们不可能全部进行分析, 毕竟太多了. 本专题还是挑选了其中重要的部分 : 事件的头文件, 事件的框架 , epoll的封装, 定时器的事件管理, 信号的事件管理, 缓冲区管理.