前提条件
- libevent实际上是对unix/linux/windows网络编程模型以及IO的封装,必须具有unix高级环境编程和unix网络编程的知识。对我来说,学习libevent实际上是对以上知识的巩固。推荐W. Richard Stevens先生的四卷宝书TCP/IP协议详解,unix高级环境编程,unix网络编程两卷。再次缅怀Stevens先生,并致敬!
- libevent使用cmake进行编译,需要有cmake的粗略基础,可以参见https://blog.csdn.net/zhshuai1/article/details/97988975,也可以通过官网或者其他博客进行学习。
环境配置
建议使用CLion作为IDE进行代码阅读。CLion本身就是使用cmake进行编译的,兼容毫无问题。libevent源代码https://github.com/libevent/libevent libevent本身已经给出了很多示例代码,在sample目录下面,已经可以参阅。使用cmake编译之后也可以直接运行。
环境配置FAQ
- 如果提示找不到profile,删除手动运行cmake的文件,重新编译。或者重新同步git,但是同步之前要修改.gitignore文件,保证无关代码也被删除。
代码阅读
libevent要隐藏不同系统的差异,所以,对于一些系统调用,在原有的方法基础上进行了封装,在很多地方也支持用户自行定义。后面会有一些例子。event.h前面的说明文档非常值得一读,几乎介绍了整个的libevent的主要功能和使用的大致流程。
概览
event.h中存放了所有和libevent相关的函数原型,可以顾名思义。
<event2/keyvalq_struct.h>,以下这段代码非常巧妙,在不支持模板和泛型的C中硬是使用宏定义写出了泛型,充分利用了宏定义的元编程能力,巧妙!
可配置性
可配置的方法引用的变量都以fn(s)_结尾
1. 内存分配方法 event_set_mem_functions
2. 锁方法 evthread_set_lock_callbacks evthread_set_condition_callbacks
初始化
event_base_new_with_config
需要满足两个条件,一个是由传入参数event_config指定的,另外一个是环境变量中的配置。其中很多操作都是直接把配置的值从event_config拷贝到event_base中。另外一个很重要的步骤是选择evsel(eventop类型),这个是选取IO操作的类型,epoll,kqueue,select或者其他,他们之间是有优先级的区分的,策略是寻找第一个满足cfg限制条件的类型。