版权声明:本文为aggresss原创文章,未经博主允许不得转载。 作者:[email protected] https://blog.csdn.net/aggresss/article/details/79946343
下载 Libevent 源码,切换到 2.1.8 稳定版本,步骤如下:
git clone https://github.com/libevent/libevent.git
cd libevent
git checkout release-2.1.8-stable
在分析源码先要先对源码进行配置,因为 libevent/include/event2/event-config.h 文件只有在配置后才会根据当前系统环境生成,所以需要一直执行到 make
成功才行,在 .libs 目录下会生成 libevent***.so 的库文件,当然 make install
可以省略掉,因为我们只是用来分析,并不想干扰本地系统,下面是配置步骤:
apt-get install build-essential automake autoconf libtool m4
cd libevent
./autogen.sh
./configure
make
如果对源码进行了修改后想恢复可以使用下面的步骤:
shopt -s extglob
git clean -dxf // rm -rf !(.git) .* //MacOS// rm -rf !(.git) *
git reset --hard
使用 Eclipse 查看 Libevent 源码的步骤:
- File -> New -> Makefile Project with Existing Code
- 选择 Libevent 所在目录,导入代码
- Toolchain for indexer setting -> none
- 工程属性 -> paths and Symbols -> Includes -> GNU C -> 添加下图所示目录,注意顺序很重要,也可以通过 配置文件 导入。
配置好 indexer 的路径后就可以很方便的查看 Libevent 的源码了:
导出头文件列表备注说明:
# tree libevent/include/event2
├── buffer_compat.h
├── bufferevent_compat.h
├── bufferevent.h
├── bufferevent_ssl.h
├── bufferevent_struct.h
├── buffer.h
├── dns_compat.h
├── dns.h
├── dns_struct.h
├── event_compat.h
├── event-config.h
├── event.h
├── event_struct.h
├── http_compat.h
├── http.h
├── http_struct.h
├── keyvalq_struct.h
├── listener.h
├── rpc_compat.h
├── rpc.h
├── rpc_struct.h
├── tag_compat.h
├── tag.h
├── thread.h
├── util.h
└── visibility.h
导出库文件列表备注说明:
# tree libevent/.libs -P "libevent*so*"
├── libevent-2.1.so.6.0.2 // 为了兼容老版本应用,包含core和extra的所有内容
├── libevent_core-2.1.so.6.0.2 // libevent 核心模块
├── libevent_extra-2.1.so.6.0.2 // libevent内部实现的 HTTP,DNS,RPC模块的库文件
├── libevent_openssl-2.1.so.6.0.2 // libevent_core的支持openssl版本
└── libevent_pthreads-2.1.so.6.0.2 // libevent_core的支持pthread版本
libevent 源码中每个文件的备注说明列表:
libevent dirs: 7 files:88
# tree -L 1 -d
── dir
├── cmake/
├── compat/
├── include/
├── m4/
├── sample/
├── test/
└── WIN32-Code/
# tree -L 1 -P "*.h" --dirsfirst
── *.h files:23
├── bufferevent-internal.h
├── changelist-internal.h
├── defer-internal.h
├── epolltable-internal.h
├── evbuffer-internal.h
├── event-internal.h
├── evmap-internal.h
├── evrpc-internal.h
├── evsignal-internal.h
├── evthread-internal.h
├── ht-internal.h
├── http-internal.h
├── iocp-internal.h
├── ipv6-internal.h
├── kqueue-internal.h
├── log-internal.h
├── minheap-internal.h // 最小堆数据结构的实现
├── mm-internal.h
├── openssl-compat.h
├── ratelim-internal.h
├── strlcpy-internal.h
├── time-internal.h
└── util-internal.h
# tree -L 1 -P "*.c" --dirsfirst
── *.c files:35
├── arc4random.c
├── buffer.c
├── bufferevent_async.c
├── bufferevent.c
├── bufferevent_filter.c
├── bufferevent_openssl.c
├── bufferevent_pair.c
├── bufferevent_ratelim.c
├── bufferevent_sock.c
├── buffer_iocp.c
├── devpoll.c
├── epoll.c
├── epoll_sub.c
├── evdns.c
├── event.c
├── event_iocp.c
├── event_tagging.c
├── evmap.c
├── evport.c
├── evrpc.c
├── evthread.c
├── evthread_pthread.c
├── evthread_win32.c
├── evutil.c
├── evutil_rand.c
├── evutil_time.c
├── http.c
├── kqueue.c
├── listener.c
├── log.c
├── poll.c
├── select.c
├── signal.c
├── strlcpy.c
└── win32select.c
# tree -L 1 -I "*.h|*.c" --dirsfirst
── misc files: 30
├── appveyor.yml // AppVeyor 持续集成工具配置文件
├── autogen.sh // Autotools 运行脚本
├── ChangeLog
├── ChangeLog-1.4
├── ChangeLog-2.0
├── checkpatch.sh
├── CMakeLists.txt // Cmake 配置文件,用于 Cmake 编译
├── configure.ac // Autoconf 配置文件,用于生成 configure 文件
├── CONTRIBUTING.md
├── Doxyfile // Doxygen 代码文档配置文件
├── evconfig-private.h.cmake
├── evconfig-private.h.in
├── evdns.3
├── event.3
├── event-config.h.cmake
├── event_rpcgen.py
├── libevent_core.pc.in
├── libevent_extra.pc.in
├── libevent_openssl.pc.in
├── libevent.pc.in
├── libevent_pthreads.pc.in
├── LICENSE //开源协议信息
├── make_epoll_table.py
├── make-event-config.sed
├── Makefile.am // Automake 配置文件,用于生成 Makefile
├── Makefile.nmake // nmake 配置文件,用于 windows 平台编译
├── README.md
├── Vagrantfile // Vagrant 集成安装工具配置文件
├── whatsnew-2.0.txt
└── whatsnew-2.1.txt
参考文档
- GNU/Autotools 使用流程分析
- Fast portable non-blocking network programming with Libevent
- The C10K problem
- libevent源码深度剖析 sparkliang 2009
- Libevent学习笔记(2)-基本数据结构 xGuru 2010
- Libevent分析笔记(3)-I/O复用(Multiplexing)机制的确定 xGuru 2010
- libevent源码分析 YY哥 2010
- libevent2.0 源码学习 small_qch 2014
- Libevent源码分析 luotuo44 2014
- Libevent源码分析 Allen Xu 2015
- libevent源码分析 冷冰若水 2016
- libevent高性能网络库源码分析 Wallace 2016
- libevent 深入浅出 刘丹冰 2017