没有合适的资源?快使用搜索试试~ 我知道了~
首页libevent中文参考手册
libevent中文参考手册
4星 · 超过85%的资源 需积分: 49 570 下载量 174 浏览量
更新于2023-03-16
评论 10
收藏 3.35MB PDF 举报
最新的libevent中文参考手册; Libevent 是用于编写高速可移植非阻塞 IO 应用的库,其设计目标是: 可移植性:使用 libevent 编写的程序应该可以在 libevent 支持的所有平台上工作。即使 没有好的方式进行非阻塞 IO,libevent 也应该支持一般的方式,让程序可以在受限的 环境中运行。 速度:libevent 尝试使用每个平台上最高速的非阻塞 IO 实现,并且不引入太多的额外开 销。 可扩展性:libevent 被设计为程序即使需要上万个活动套接字的时候也可以良好工作。 方便:无论何时,最自然的使用 libevent 编写程序的方式应该是稳定的、可移植的。
资源详情
资源评论
资源推荐
Libevent 参考手册:前言
1 从一万英尺外看 Libevent
Libevent 是用于编写高速可移植非阻塞 IO 应用的库,其设计目标是:
可移植性:使用 libevent 编写的程序应该可以在 libevent 支持的所有平台上工作。即使
没有好的方式进行非阻塞 IO,libevent 也应该支持一般的方式,让程序可以在受限的
环境中运行。
速度:libevent 尝试使用每个平台上最高速的非阻塞 IO 实现,并且不引入太多的额外开
销。
可扩展性:libevent 被设计为程序即使需要上万个活动套接字的时候也可以良好工作。
方便:无论何时,最自然的使用 libevent 编写程序的方式应该是稳定的、可移植的。
libevent 由下列组件构成:
evutil:用于抽象不同平台网络实现差异的通用功能。
event 和 event_base:libevent 的核心,为各种平台特定的、基于事件的非阻塞 IO 后端
提供抽象 API,让程序可以知道套接字何时已经准备好,可以读或者写,并且处理基
本的超时功能,检测 OS 信号。
bufferevent:为 libevent 基于事件的核心提供使用更方便的封装。除了通知程序套接字
已经准备好读写之外,还让程序可以请求缓冲的读写操作,可以知道何时 IO 已经真
正发生。(bufferevent 接口有多个后端,可以采用系统能够提供的更快的非阻塞 IO 方
式,如 Windows 中的 IOCP。)
evbuffer:在 bufferevent 层之下实现了缓冲功能,并且提供了方便有效的访问函数。
evhttp:一个简单的 HTTP 客户端/服务器实现。
evdns:一个简单的 DNS 客户端/服务器实现。
evrpc:一个简单的 RPC 实现。
2 库
创建 libevent 时,默认安装下列库:
libevent_core:所有核心的事件和缓冲功能,包含了所有的 event_base、evbuffer、
bufferevent 和工具函数。
libevent_extra:定义了程序可能需要,也可能不需要的协议特定功能,包括 HTTP、
DNS 和 RPC。
libevent:这个库因为历史原因而存在,它包含 libevent_core 和 libevent_extra 的内容。
不应该使用这个库,未来版本的 libevent 可能去掉这个库。
某些平台上可能安装下列库:
libevent_pthreads:添加基于 pthread 可移植线程库的线程和锁定实现。它独立于
libevent_core,这样程序使用 libevent 时就不需要链接到 pthread,除非是以多线程方式
使用 libevent。
libevent_openssl:这个库为使用 bufferevent 和 OpenSSL 进行加密的通信提供支持。
它独立于 libevent_core,这样程序使用 libevent 时就不需要链接到 OpenSSL,除非是
进行加密通信。
3 头文件
libevent 公用头文件都安装在 event2 目录中,分为三类:
API 头文件:定义 libevent 公用接口。这类头文件没有特定后缀。
兼容头文件:为已废弃的函数提供兼容的头部包含定义。不应该使用这类头文件,除非
是在移植使用较老版本 libevent 的程序时。
结构头文件:这类头文件以相对不稳定的布局定义各种结构体。这些结构体中的一些是
为了提供快速访问而暴露;一些是因为历史原因而暴露。直接依赖这类头文件中的任
何结构体都会破坏程序对其他版本 libevent 的二进制兼容性,有时候是以非常难以调
试的方式出现。这类头文件具有后缀“_struct.h”。
(还存在不在 event2 目录中的较老版本 libevent 的头文件,请参考下节:如果需要使用老版
本 libevent)
4 如果需要使用老版本 libevent
libevent 2.0 以更合理的、不易出错的方式修正了 API。如果可能,编写新程序时应该使
用 libevent 2.0。但是有时候可能需要使用较老的 API,例如在升级已存的应用时,或者支持
因为某些原因不能安装 2.0 或者更新版本 libevent 的环境时。
较老版本的 libevent 头文件较少,也不安装在 event2 目录中。
在 2.0 以及以后版本的 libevent 中,老的头文件仍然会作为新头文件的封装而存在。
其他关于使用较老版本的提示:
1.4 版之前只有一个库 libevent,它包含现在分散到 libevent_core 和 libevent_extra 中的所
有功能。
2.0 版之前不支持锁定:只有确定不同时在多个线程中使用同一个结构体时,libevent
才是线程安全的。
下面的节还将讨论特定代码区域可能遇到的已经废弃的 API。
5 关于版本状态的提示
1.4.7 及以前版本应该被认为是完全废弃的。1.3 之前的版本应该被认为是充满 bug 的。
(此外,不要向 libevent 维护者发送任何关于 1.4.x 或者更早版本的新特征,这些版本被认
为是稳定的发布版本。如果在 1.3x 或者更早版本中发现 bug,在报告之前请确定在最新的稳
定发布版本中问题仍然存在:后续发布可能已经解决了问题。)
libevent 参考手册第二章:创建 event_base
使用 libevent 函数之前需要分配一个或者多个 event_base 结构体。每个 event_base
结构体持有一个事件集合,可以检测以确定哪个事件是激活的。
如果设置 event_base 使用锁,则可以安全地在多个线程中访问它。然而,其事件循环
只能运行在一个线程中。如果需要用多个线程检测 IO,则需要为每个线程使用一个
event_base。
每个 event_base 都有一种用于检测哪种事件已经就绪的“方法”,或者说后端。可以
识别的方法有:
select
poll
epoll
kqueue
devpoll
evport
win32
用户可以用环境变量禁止某些特定的后端。比如说,要禁止 kqueue 后端,可以设置
EVENT_NOKQUEUE 环境变量。如果要用编程的方法禁止后端,请看下面关于
event_config_avoid_method()的说明。
1 建立默认的 event_base
event_base_new()函数分配并且返回一个新的具有默认设置的 event_base。函数会
检测环境变量,返回一个到 event_base 的指针。如果发生错误,则返回 NULL。选择各种方
法时,函数会选择 OS 支持的最快方法。
接口
大多数程序使用这个函数就够了。
event_base_new()函数声明在<event2/event.h>中,首次出现在 libevent 1.4.3 版。
2 创建复杂的 event_base
要对取得什么类型的 event_base 有更多的控制,就需要使用 event_config。
event_config 是一个容纳 event_base 配置信息的不透明结构体。需要 event_base 时,将
event_config 传递给 event_base_new_with_config()。
2.1 接口
要使用这些函数分配 event_base,先调用 event_config_new()分配一个 event_config。
然后,对 event_config 调用其它函数,设置所需要的 event_base 特征。最后,调用
event_base_new_with_config()获取新的 event_base。完成工作后,使用
event_config_free()释放 event_config。
2.2 接口
调用 event_config_avoid_method()可以通过名字让 libevent 避免使用特定的可用
后端。调用 event_config_require_feature()让 libevent 不使用不能提供所有指定特征
的后端。调用 event_config_set_flag()让 libevent 在创建 event_base 时设置一个或者
多个将在下面介绍的运行时标志。
event_config_require_features()可识别的特征值有:
EV_FEATURE_ET:要求支持边沿触发的后端
EV_FEATURE_O1:要求添加、删除单个事件,或者确定哪个事件激活的操作是 O(1)复杂
度的后端
EV_FEATURE_FDS:要求支持任意文件描述符,而不仅仅是套接字的后端
event_config_set_flag()可识别的选项值有:
EVENT_BASE_FLAG_NOLOCK:不要为 event_base 分配锁。设置这个选项可以为 event_base
节省一点用于锁定和解锁的时间,但是让在多个线程中访问 event_base 成为不安全的。
EVENT_BASE_FLAG_IGNORE_ENV:选择使用的后端时,不要检测 EVENT_*环境变量。使用这
个标志需要三思:这会让用户更难调试你的程序与 libevent 的交互。
EVENT_BASE_FLAG_STARTUP_IOCP:仅用于 Windows,让 libevent 在启动时就启用任何必
需的 IOCP 分发逻辑,而不是按需启用。
EVENT_BASE_FLAG_NO_CACHE_TIME:不是在事件循环每次准备执行超时回调时检测当前时
间,而是在每次超时回调后进行检测。注意:这会消耗更多的 CPU 时间。
EVENT_BASE_FLAG_EPOLL_USE_CHANGELIST:告诉 libevent,如果决定使用 epoll 后端,
可以安全地使用更快的基于 changelist 的后端。epoll-changelist 后端可以在后端的
分发函数调用之间,同样的 fd 多次修改其状态的情况下,避免不必要的系统调用。但
是如果传递任何使用 dup()或者其变体克隆的 fd 给 libevent,epoll-changelist 后
端会触发一个内核 bug,导致不正确的结果。在不使用 epoll 后端的情况下,这个标志
是没有效果的。也可以通过设置 EVENT_EPOLL_USE_CHANGELIST 环境变量来打开
epoll-changelist 选项。
上述操作 event_config 的函数都在成功时返回 0,失败时返回-1。
注意
设置 event_config,请求 OS 不能提供的后端是很容易的。比如说,对于 libevent
2.0.1-alpha,在 Windows 中是没有 O(1)后端的;在 Linux 中也没有同时提供 EV_FEATURE_FDS
和 EV_FEATURE_O1 特征的后端。如果创建了 libevent 不能满足的配置,
event_base_new_with_config()会返回 NULL。
2.3 接口
这个函数当前仅在 Windows 上使用 IOCP 时有用,虽然将来可能在其他平台上有用。这
个函数告诉 event_config 在生成多线程 event_base 的时候,应该试图使用给定数目的 CPU。
注意这仅仅是一个提示:event_base 使用的 CPU 可能比你选择的要少。
示例
这些函数和类型在<event2/event.h>中声明。
EVENT_BASE_FLAG_IGNORE_ENV 标志首次出现在 2.0.2-alpha 版本。
event_config_set_num_cpus_hint()函数是 2.0.7-rc 版本新引入的。本节的其他内容首
次出现在 2.0.1-alpha 版本。
3 检查 event_base 的后端方法
有时候需要检查 event_base 支持哪些特征,或者当前使用哪种方法。
剩余101页未读,继续阅读
nanyun2010
- 粉丝: 16
- 资源: 16
上传资源 快速赚钱
- 我的内容管理 收起
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
会员权益专享
最新资源
- stc12c5a60s2 例程
- Android通过全局变量传递数据
- c++校园超市商品信息管理系统课程设计说明书(含源代码) (2).pdf
- 建筑供配电系统相关课件.pptx
- 企业管理规章制度及管理模式.doc
- vb打开摄像头.doc
- 云计算-可信计算中认证协议改进方案.pdf
- [详细完整版]单片机编程4.ppt
- c语言常用算法.pdf
- c++经典程序代码大全.pdf
- 单片机数字时钟资料.doc
- 11项目管理前沿1.0.pptx
- 基于ssm的“魅力”繁峙宣传网站的设计与实现论文.doc
- 智慧交通综合解决方案.pptx
- 建筑防潮设计-PowerPointPresentati.pptx
- SPC统计过程控制程序.pptx
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论30