2009年02月23日

libevent是一个异步事件处理软件函式库,以BSD许可证释出。

提供了一组应用程序编程接口(API),让程式设计师可以设定某些事件发生时所执行的函式,也就是说,可以用来取代网络服务器所使用的循环检查架构。

摘自维基百科

http://blog.gslin.info/2005/11/network-programming-using-libevent-i.html
这里介绍了相关的网络编程背景,需要带套访问哦。

以下分析针对-1.4.3-stable。

来看libevent自带的例子:

我把原来代码中WIN平台相关的去掉了,看起来方便一些,这个例子创建了一个pipe,并且使用来监听是否可读,读有数据可读时调用函数fifo_read。
调用比较简单,首先event_init()对event库进行初始化,然后使用event_set()来对某个fd的操作进行监听,接着使用event_add()把这个event激活,这里可以指定超时的时间,最后一步event_dispatch(),开始进行循环。

event_init()里只是对外的一个接口,这个函数调用了event_base_new(),分配了一个event_base类型的空间,设置了一些全局变量,使用detect_monotonic来检测是否支持CLOCK_MONOTONIC类型的时钟,这里不太理解为什么要使用clock_gettime(CLOCK_MONOTONIC, &ts)来获得当前时间,这个与gettimeofday得到的精度是一样的,只是一个是标准的时间(UNIX元年算起),一个是开机时间算起,有什么差别吗?

CLOCK_MONOTONICI测试代码:

结果:

[cocobear@cocobear -1.4.3-stable]$ gcc ftime. -lrt
[cocobear@cocobear -1.4.3-stable]$ ./a.out
sec=1235372220
sec=4621

接下来就检测可使用的事件检测函数,这里与系统相关的调用被封装成了一个结构eventop:

:
  1. struct eventop {
  2.     const char *name;
  3.     void *(*init)(struct event_base *);
  4.     int (*add)(void *, struct event *);
  5.     int (*del)(void *, struct event *);
  6.     int (*dispatch)(struct event_base *, void *, struct timeval *);
  7.     void (*dealloc)(struct event_base *, void *);
  8.     /* set if we need to reinitialize the event base */
  9.     int need_reinit;
  10. };

编译时会通过

:
  1. #ifdef HAVE_SELECT
  2.     &selectops,
  3. #endif

来“动态”的确定eventops数组,在定义这个eventops数组时确定了使用这些事件驱动模型的顺序,如果你机子上有多种可用的模式,则可以通过修改改数组来自定义使用的模型。

在event_base_new()的最后调用了event_base_priority_init()初始化了消息的优先级队列。主要就是对activequeues变量进行空间分配。默认是分配了一个event_list给activequeues。

标签 :

随机日志

发表评论

在下面加入你的评论,或者 trackback 从你的博客站点。 订阅本文的评论。

:

:

:

«
»