Libevent 源码文件结构分析

下载 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 -> 添加下图所示目录,注意顺序很重要,也可以通过 配置文件 导入。
    Libevent 源码文件结构分析_第1张图片
    配置好 indexer 的路径后就可以很方便的查看 Libevent 的源码了:
    Libevent 源码文件结构分析_第2张图片

导出头文件列表备注说明:

# 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

参考文档

  1. GNU/Autotools 使用流程分析
  2. Fast portable non-blocking network programming with Libevent
  3. The C10K problem
  4. libevent源码深度剖析 sparkliang 2009
  5. Libevent学习笔记(2)-基本数据结构 xGuru 2010
  6. Libevent分析笔记(3)-I/O复用(Multiplexing)机制的确定 xGuru 2010
  7. libevent源码分析 YY哥 2010
  8. libevent2.0 源码学习 small_qch 2014
  9. Libevent源码分析 luotuo44 2014
  10. Libevent源码分析 Allen Xu 2015
  11. libevent源码分析 冷冰若水 2016
  12. libevent高性能网络库源码分析 Wallace 2016
  13. libevent 深入浅出 刘丹冰 2017

你可能感兴趣的:(Miscellaneous)