没有合适的资源?快使用搜索试试~ 我知道了~
资源详情
资源评论
资源推荐
Libevent 参考手册:前言
1 从一万英尺外看 Libevent
是用于编写高速可移植非阻塞 IO 应用的库,其设计目标是:
可移植性:使用 libevent 编写的程序应该可以在 libevent 支持的所有平台上工作。即使
没有好的方式进行非阻塞 IO,libevent 也应该支持一般的方式,让程序可以在受限的
环境中运行。
速度:libevent 尝试使用每个平台上最高速的非阻塞 IO 实现,并且不引入太多的额外
开销。
可扩展性:libevent 被设计为程序即使需要上万个活动套接字的时候也可以良好工作。
方便:无论何时,最自然的使用 libevent 编写程序的方式应该是稳定的、可移植的。
由下列组件构成:
:用于抽象不同平台网络实现差异的通用功能。
和 event_base:libevent 的核心,为各种平台特定的、基于事件的非阻塞 IO 后端
提供抽象 API,让程序可以知道套接字何时已经准备好,可以读或者写,并且处理基
本的超时功能,检测 OS 信号。
:为 libevent 基于事件的核心提供使用更方便的封装。除了通知程序套接
字已经准备好读写之外,还让程序可以请求缓冲的读写操作,可以知道何时 IO 已经
真正发生。(bufferevent 接口有多个后端,可以采用系统能够提供的更快的非阻塞
IO 方式,如 Windows 中的 IOCP。)
:在 bufferevent 层之下实现了缓冲功能,并且提供了方便有效的访问函数。
:一个简单的 HTTP 客户端/服务器实现。
:一个简单的 DNS 客户端/服务器实现。
:一个简单的 RPC 实现。
2 库
创建 libevent 时,默认安装下列库:
: 所 有 核 心 的 事 件 和 缓 冲 功 能 , 包 含 了 所 有 的
event_base、evbuffer、bufferevent 和工具函数。
: 定义 了程序可能需要,也可能不需要 的协 议特 定 功 能 , 包 括
HTTP、DNS 和 RPC。
:这个库因为历史原因而存在,它包含 libevent_core 和 libevent_extra 的内容。
不应该使用这个库,未来版本的 libevent 可能去掉这个库。
某些平台上可能安装下列库:
:添加基于 pthread 可移植线程库的线程和锁定实现。它独立于
libevent_core,这样程序使用 libevent 时就不需要链接到 pthread,除非是以多线程方
式使用 libevent。
:这个库为使用 bufferevent 和 OpenSSL 进行加密的通信提供支持。
它独立于 libevent_core,这样程序使用 libevent 时就不需要链接到 OpenSSL,除非是
进行加密通信。
3 头文件
公用头文件都安装在 event2 目录中,分为三类:
头文件:定义 libevent 公用接口。这类头文件没有特定后缀。
兼容头文件:为已废弃的函数提供兼容的头部包含定义。不应该使用这类头文件,除
非是在移植使用较老版本 libevent 的程序时。
结构头文件:这类头文件以相对不稳定的布局定义各种结构体。这些结构体中的一些
是为了提供快速访问而暴露;一些是因为历史原因而暴露。直接依赖这类头文件中的
任何结构体都会破坏程序对其他版本 libevent 的二进制兼容性,有时候是以非常难以
调试的方式出现。这类头文件具有后缀“_struct.h。
(还存在不在 event2 目录中的较老版本 libevent 的头文件,请参考下节:如果需要使用老
版本 libevent)
4 如果需要使用老版本 libevent
以更合理的、不易出错的方式修正了 API。如果可能,编写新程序时应该使
用 libevent 2.0。但是有时候可能需要使用较老的 API,例如在升级已存的应用时,或者支
持因为某些原因不能安装 2.0 或者更新版本 libevent 的环境时。
较老版本的 libevent 头文件较少,也不安装在 event2 目录中。
在 2.0 以及以后版本的 libevent 中,老的头文件仍然会作为新头文件的封装而存在。
其他关于使用较老版本的提示:
版之前只有一个库 libevent,它包含现在分散到 libevent_core 和 libevent_extra 中的
所有功能。
版之前不支持锁定:只有确定不同时在多个线程中使用同一个结构体时,libevent
才是线程安全的。
下面的节还将讨论特定代码区域可能遇到的已经废弃的 API。
5 关于版本状态的提示
及以前版本应该被认为是完全废弃的。1.3 之前的版本应该被认为是充满 bug 的。
(此外,不要向 libevent 维护者发送任何关于 1.4.x 或者更早版本的新特征,这些版本被认
为是稳定的发布版本。如果在 1.3x 或者更早版本中发现 bug,在报告之前请确定在最新的
稳定发布版本中问题仍然存在:后续发布可能已经解决了问题。)
libevent 参考手册第二章:创建 event_base
使 用 函 数 之 前 需 要 分 配 一 个 或 者 多 个 结 构 体 。 每 个
结构体持有一个事件集合,可以检测以确定哪个事件是激活的。
如果设置 使用锁,则可以安全地在多个线程中访问它。然而,其事件循
环只能运行在一个线程中。如果需要用多个线程检测 !,则需要为每个线程使用一个
。
每个 都有一种用于检测哪种事件已经就绪的“方法”,或者说后端。可以
识别的方法有:
"#
$%
用户可以用环境变量禁止某些特定的后端。比如说,要禁止 "# 后端,可以设置
&'&()(!*+,&,& 环 境 变 量 。 如 果 要 用 编 程 的 方 法 禁 止 后 端 , 请 看 下 面 关 于
-./()的说明。
1 建立默认的 event_base
$()函数分配并且返回一个新的具有默认设置的 。函
数会检测环境变量,返回一个到 的指针。如果发生错误,则返回 (,。选
择各种方法时,函数会选择 !0 支持的最快方法。
接口
大多数程序使用这个函数就够了。
$()函数声明在 123 中, 首次出现在
% 版。
2 创建复杂的 event_base
要 对 取 得 什 么 类 型 的 有 更 多 的 控 制 , 就 需 要 使 用
-.。-. 是一个容纳 配置信息的不透明结构体。需要
时,将 -. 传递给 $$-.()。
2.1 接口
要 使 用 这 些 函 数 分 配 , 先 调 用 -.$ ( ) 分 配 一 个
-.。然后,对 -. 调用其它函数,设置所需要的 特征。
最后,调用 $$-.()获取新的 。完成工作后,
使用 -.4()释放 -.。
2.2 接口
调用 -./()可以通过名字让 避免使用特定的
可用后端。调用 -.#4()让 不使用不能提供所有指
定特征的后端。调用 -.5.()让 在创建 时设
置一个或者多个将在下面介绍的运行时标志。
-.#4()可识别的特征值有:
&'6&),7&&):要求支持边沿触发的后端
&'6&),7&!: 要求添加、 删除单个事 件,或者 确定哪个 事件激活 的操作是
!()复杂度的后端
&'6&),7&680:要求支持任意文件描述符,而不仅仅是套接字的后端
-.5.()可识别的选项值有:
&'&()90&6:(!!;*:不要为 分配锁。设置这个选项可以为
节 省 一 点 用 于 锁 定 和 解 锁 的 时 间 , 但 是 让 在 多 个 线 程 中 访 问
成为不安全的。
&'&()90&6::(!7&&(':选择使用的后端时,不要检测 &'&()<环境变
量。使用这个标志需要三思:这会让用户更难调试你的程序与 的交互。
&'&()90&6:0)7),!;:仅用于 =$,让 在启动时就
启用任何必需的 !; 分发逻辑,而不是按需启用。
&'&()90&6:(!;;>&)?&:不是在事件循环每次准备执行超时回调时
检测当前时间,而是在每次超时回调后进行检测。注意:这会消耗更多的 ;, 时间。
&'&()90&6:&!,0&;>(:&0) : 告 诉 , 如 果 决 定 使 用
后端,可以安全地使用更快的基于 . 的后端。@. 后端
可以在后端的分发函数调用之间,同样的 4 多次修改其状态的情况下,避免不必要的
系统调用。但是如果传递任何使用 ()或者其变体克隆的 4 给 ,@
. 后端会触发一个内核 .,导致不正确的结果。在不使用 后端的情
况下,这个标志是没有效果的。也可以通过设置 &'&()&!,0&;>(:&0)
环境变量来打开 @. 选项。
上述操作 -. 的函数都在成功时返回 ,失败时返回@。
注意
设置 -.,请求 !0 不能提供的后端是很容易的。比如说,对于
@ , 在 =$ 中是 没 有 ! ( ) 后 端 的 ; 在 中也 没 有 同 时 提 供
&'6&),7&680 和 &'6&),7&! 特征的后端。如果创建了 不能满足的
配置,$$-.()会返回 (,。
2.3 接口
这个函数当前仅在 =$ 上使用 !; 时有用,虽然将来可能在其他平台上有用
这个函数告诉 -. 在生成多线程 的时候,应该试图使用给定数目
的 ;,。注意这仅仅是一个提示: 使用的 ;, 可能比你选择的要少。
示例
这些函数和类型在123中声明。
&'&()90&6::(!7&&(' 标 志 首 次 出 现 在 @ 版 本 。
-./()函数是 @ 版本新引入的。本节的其他内
容首次出现在 @ 版本。
3 检查 event_base 的后端方法
有时候需要检查 支持哪些特征,或者当前使用哪种方法。
剩余63页未读,继续阅读
weifc-wei
- 粉丝: 134
- 资源: 8
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0