现在的位置: 首页 > 综合 > 正文

学习使用libevent(一)

2013年08月18日 ⁄ 综合 ⁄ 共 2136字 ⁄ 字号 评论关闭

PRE——写在前面的话

最近在学习libevent,希望可以好好整理一下~

计划是这样,先简单总结一下怎么使用它,然后开始分析源代码。

其实,目前网上已经有不少相关资料,比如说,官网(http://libevent.org/)为我们提供的Documentation,还有http://cpp.ezbty.org/的《libevent源码深度剖析系列》,这里再总结一下,也算是对自己的提高吧。

废话不再多说,接下来,本文将具体介绍libevent的使用。

libevent简介

首先简单介绍一下libevent,它是一个开源的轻量级网络库,具有良好的跨平台特性,支持Linux, FreeBSD, OpenBSD, NetBSD, Mac OS X, Solaris, Android等各种平台,支持多种不同的I/O多路复用机制。它采用的是基于事件驱动(event-driven)的模型,这里的事件包括有:I/O,定时器,信号等。

event和event_base是其最核心的部分。

event_base

一、创建event_base

有两种方式。

第一,默认方式创建;

struct event_base *event_base_new(void);

默认情况下,libevent会选择该平台下效率最高的I/O多路复用机制作为其backend使用的method。

第二,自定义方式创建;

struct event_config *event_config_new(void);
struct event_base *event_base_new_with_config(const struct event_config *cfg);
void event_config_free(struct event_config *cfg);

首先,调用event_config_new()函数创建一个event_config对象,然后调用下面即将讲到的几个接口来指定method属性,再调用event_base_new_with_config()创建对应的event_base,创建完以后,event_config就没用了,别忘了释放掉。libevent为我们提供的这些接口函数有:

int event_config_avoid_method(struct event_config *cfg, const char *method);

int event_config_require_features(struct event_config *cfg, enum event_method_feature feature);

int event_config_set_flag(struct event_config *cfg, enum event_base_config_flag flag);

第一个,很直白地告诉libevent不希望使用哪个method,传入参数就是method的名字,比如说"epoll";

第二个,告诉libevent需要支持哪些features,包括有:

    EV_FEATURE_ET 支持边沿触发方式(epoll)

    EV_FEATURE_O1 事件插入删除查找的时间复杂度均为O(1)(epoll)

    EV_FEATURE_FDS 支持任意的文件描述符,不止socket一种(select、poll)

第三个,设置flag,具体这里不再一一说明。

需要明确的是,上面三个接口函数若成功均返回0,-1则表示失败。

若平台没有满足指定要求的method,调用event_base_new_with_config()将返回NULL表示失败。

二、销毁event_base

方法很简单,直接调用函数

void event_base_free(struct event_base *base);

三、设置event_base的优先级

相关接口函数有:

int event_base_priority_init(struct event_base *base, int n_priorities);

int event_base_get_npriorities(struct event_base *base);

调用第一个函数,优先级被设置为0~n_priorities-1,其中0表示最高。

第二个函数返回的是该event_base所支持的事件优先级个数。

四、其它辅助函数

const char **event_get_supported_methods(void);

获取本平台所支持的所有methods。

!注意:这个函数返回的是一个字符串数组,内存空间是由该函数申请的,但不需要程序员去手动释放(如果手动释放的话,也不会出现bug)。(具体原因见代码实现)

const char *event_base_get_method(const struct event_base *base);

获取本event_base的backend所使用的method。

enum event_method_feature event_base_get_features(const struct event_base *base);

获取本event_base的backend所使用的method属性。返回的是对应的bitmask值。



To Be Continued...

【上篇】
【下篇】

抱歉!评论已关闭.