# libevent源码深度剖析一


# libevent源码深度剖析一

### 1. 前言 

libevent是一个轻量级的开源高性能网络库，使用者众多，研究者更甚，相关文章也不少。写这一系列文章的用意在于，一则分享心得；二则对libevent代码和设计思想做系统的、更深层次的分析，写出来，也可供后来者参考。

附带一句：libevent是用**c语言**编写的（大牛们都偏爱c语言哪），而且几乎是无处不函数指针，学习其源代码也需要相当的c语言基础。

### 2. Libevent简介

上来当然要先夸奖啦，libevent 有几个显著的亮点：
事件驱动（event-driven），高性能;
轻量级，专注于网络，不如ACE那么臃肿庞大；
源代码相当精炼、易读；
跨平台，支持Windows、Linux、BSD和Mac Os；
支持多种I/O多路复用技术， epoll、poll、dev/poll、select和kqueue等；
支持I/O，定时器和信号等事件；
注册事件优先级；

libevent已经被广泛的应用，作为底层的网络库；比如memcached、Vomit、Nylon、Netchat等等。
libevent当前的最新稳定版是1.4.13；这也是本文参照的版本。

### 3. 学习的好处

学习libevent有助于提升程序设计功力，除了网络程序设计方面外，libevent的代码里有很多有用的设计技巧和基础数据结构，比如信息隐藏、函数指针、c语言的多态支持、链表和堆等等，都有助于提升自身的程序功力。
程序设计不止要了解框架，很多细节之处恰恰也是事关整个系统成败的关键。只对libevent本身的框架大概了解，那或许仅仅是一知半解，不深入代码分析，就难以了解其设计的精巧之处，也就难以为自己所用。

事实上libevent本身就是一个典型的**Reactor**模型，理解Reactor模式是理解libevent的基石；因此下一节将介绍典型的事件驱动设计模式——Reactor模式。

参考资料：
libevent官方地址: http://monkey.org/~provos/libevent/
