项目的简介

我理解libevent是一个轻量级的,跨平台+高效的(C语言实现)事件驱动库,类似于ACE项目中的ACE_Reactor,它实现了网络通讯套接口I/O事件,定时器事件,信号事件的监听和事件处理函数回调机制。从项目主页可以了解到libevent已经支持 /dev/poll, kqueue(2), event ports, POSIX select(2), Windows select(), poll(2), and epoll(4)方式的事件监测和驱动机制

项目主页:http://libevent.org/

维基百科:http://zh.wikipedia.org/wiki/Libevent

参考资料:http://blog.csdn.net/sparkliang/article/details/4957667

PS:在分析开源项目代码之前,需首先了解该项目的特性,应用场景和价值,这些信息一方面可以从项目的主页获取,另一方面可以通过搜索引擎从技术论坛,博客等方面获取。最好选择和自己工作/兴趣比较相关的项目,这样有利于分析的深入和坚持,并及时体现收益。

下载源代码

从项目主页可以很方便的下载当前版本的源码,我下载的版本是libevent-2.0.17-stable.tar.gz

代码量分析

通过Wine运行SourceCounter工具对该项目进行代码量统计,可以看到该项目代码量大概5W多行,且代码工程结构简单,比较适合像我这样对开源项目代码分析经验不足的人

PS:在开始分析项目源码之前,分析该项目的代码量可以大致评估该项目的难度和分析计划,分析工程结构可以大致评估该项目的重点部分,以免一开始就满腔热血地栽在一个深坑里(比较复杂的开源项目),而后面又不了了之

编译和安装

在将源码包在本地解压后即可以编译和安装。这里和其他开源项目差不多,没有什么特别的,只是为了方便后面通过调试的手段来分析源码,编译的时候最好编译成debug模式,如下

#./configure --enable-debug-mode --enable-static --enable-thread-support

#make

#make install

安装完成后,libevent库的头文件会安装在/usr/local/include目录下,而库文件会安装在/usr/local/lib目录下,故需确保/usr/local/lib在LD_LIBRARY_PATH变量包含的路径中

PS:卸载的方法

#make uninstall

#make clean

编写测试应用代码

该项目源码包中的sample目录中其实已经有些例子,但我还是情愿参考样例自己写一个,好久没Coding了 :)

mytimer.c : 实现一个定时器事件处理函数,并通过libevent的事件驱动机制定时调用

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>

#include <event2/event-config.h>
#include <event2/event.h>
#include <event2/event_struct.h>
#include <event2/util.h>

static void handle_timer(evutil_socket_t fd, short event, void* arg)
{
printf("handle_timer function is called \n");
fflush(stdout);
}

int main(int argc, char** argv)
{
/* Initalize the event library */
struct event_base* base = event_base_new();
if (NULL == base)
{
return -1;
}

/* Initalize one timeout event */
struct event timeout = {0};
event_assign(&timeout, base, -1, EV_PERSIST, handle_timer, (void*)&timeout);

/* Register the event */
struct timeval tv;
evutil_timerclear(&tv);
tv.tv_sec = 2;
event_add(&timeout, &tv);

/*event dispatch*/
event_base_dispatch(base);

event_base_free(base);

return 0;
}

编译 : gcc -g -I/usr/local/include -o mytimer mytimer.c -L/usr/local/lib -levent

运行 : $ ./mytimer 
handle_timer function is called 
handle_timer function is called 
handle_timer function is called 
^C

通过例程调试libevent

通过gdb去调试mytimer时发现其链接的是libevent的动态库,且无法在libevent库的函数上设置断点 :(

安装glibc的静态库:# yum install glibc-static libstdc++-static

静态编译命令:gcc -g -I/usr/local/include -o mytimer mytimer.c -L/usr/local/lib -static -levent -lc -lrt

这样就可以通过gdb调试例程时,在libevent库的函数上设置断点

libevent项目分析(一) -- 准备阶段相关推荐

  1. libevent源码深度剖析八

    libevent源码深度剖析八 --集成信号处理 张亮 现在我们已经了解了libevent的基本框架:事件管理框架和事件主循环.上节提到了libevent中I/O事件和Signal以及Timer事件的 ...

  2. libevent源码深度剖析十

    libevent源码深度剖析十 --支持I/O多路复用技术 张亮 Libevent的核心是事件驱动.同步非阻塞,为了达到这一目标,必须采用系统提供的I/O多路复用技术,而这些在Windows.Linu ...

  3. 转:libev和libevent的设计差异

    转:http://www.cnblogs.com/Lifehacker/p/whats_the_difference_between_libevent_and_libev_chinese.html [ ...

  4. libevent 源码分析丨libevent组件构成以及编程要领

    1,前言 Libevent是一个轻量级的开源高性能网络库,使用者众多,研究者更甚,相关文章也不少.写这一系列文章的用意在于,一则分享心得:二则对libevent代码和设计思想做系统的.更深层次的分析, ...

  5. 规模估算失准 软件开发成空中楼阁

    软件项目的估算历来是比较复杂的事,因为软件本身的复杂性.历史经验的可重复性.估算工具的缺乏以及一些人为错误,都会导致软件项目的估算往往和实际情况相差甚远.据有关机构调查发现,约有60%的软件项目的失败 ...

  6. PHP SOCKET SERVER

    Socket(套接字)一直是网络层的底层核心内容,也是 TCP/IP 以及 UDP 底层协议的实现通道.随着互联网信息时代的爆炸式发展,当代服务器的性能问题面临越来越大的挑战,著名的 C10K 问题( ...

  7. libevent和libcurl实现http和https服务器 cJSON使用

    前言 libevent和libcurl都是功能强大的开源库:libevent主要实现服务器,包含了select.epoll等高并发的实现:libcurl实现了curl命令的API封装,主要作为客户端. ...

  8. libevent mysql_在 libevent 中使用 MariaDB(MySQL)

    在之前我翻译的官方文档中提到了 MariaDB 提供了对异步 I/O 的支持.那篇文章是一个比较简要的介绍.不过实际适配中,官方也提供了一个完整适配 libevent 的示例代码.本文算是对我上述示例 ...

  9. 在 libevent 中使用 MariaDB(MySQL)

    在之前我翻译的官方文档中提到了 MariaDB 提供了对异步 I/O 的支持.那篇文章是一个比较简要的介绍.不过实际适配中,官方也提供了一个完整适配 libevent 的示例代码.本文算是对我上述示例 ...

最新文章

  1. 20个将 JavaScript 用到极致的网站
  2. Algorithm:C+语言实现之数组相关算法(和为定值的两个数、和为定值的m个数、荷兰国旗、长度为2n的洗牌算法、任意长度数组的洗牌算法)
  3. BASIC-6 杨辉三角形
  4. 图解elasticsearch原理转载自
  5. 3个简单步骤即可测试Java 8
  6. 基于JavaSwing ATM取款机系统的设计和实现
  7. java boxplot_java – 具有多个类别的Boxplots的JFreeChart缩放
  8. 【250期门诊集锦】痛并快乐着的正则表达式
  9. unity3d 求两个点长度_Unity3D实现体积光
  10. [设想]增加比较的多元运算符
  11. 应该怎样学习新知识?
  12. JavaScript相关技术学习
  13. [源码和报告分享]基于Java的局域网聊天工具
  14. kubernetes架构及核心概念
  15. 网络棋牌游戏成为网游主流力量
  16. Taylor Swift - Mean-pdf
  17. 光场相机微透镜阵列排布方式以及其填充率比较
  18. 获取Android 手机设备信息:包括机型、操作系统版本号、手机分辨率、运营商、当前联网方式、IMEI、MEID、MAC地址
  19. 苹果app旧版本软件下载
  20. 缔造企鹅:产品经理是这样炼成的札记-技巧

热门文章

  1. Linq to SQL 的增删改查操作
  2. 20145202马超《信息安全系统设计基础》实验二总结
  3. 刚刚注册,打声招呼先
  4. mysql pxc_MySQL之PXC集群搭建
  5. Java排序算快速排序_Java排序算法 [快速排序]
  6. 大型计算机变形,计算机变形病毒的主要特征和发展趋势
  7. int最大值java_Java 中一个int型数组的求最大值最小值 | 学步园
  8. stm32f103r6最小系统原理图_超强PCB布线设计经验谈附原理图
  9. python做自动化如何定位动态元素_python-web自动化-元素定位
  10. 华为抢购助手_华为荣耀20系列手机采用的五项新科技,科普简介