`

libevent相关

    博客分类:
  • c++
 
阅读更多
void
event_set(struct event *ev, evutil_socket_t fd, short events,
  void (*callback)(evutil_socket_t, short, void *), void *arg)
相当于一个初始化结构体,其中的参数evutil_socket_t fd,short events,和一个void *arg将发送给callback作为它的参数

原文出自:http://lwg2001s.iteye.com/blog/289833,写的很不错,言简意赅

libevent 是一个强大的跨平台的事件通知库,如果不想被多线程困扰,可以考虑这个平台,它从1.2.* 版本开始支持轻量级的http server 开发支持,随后陆续还推出轻量级 DNS server、RPC server 开发支持

LIBEVENT的功能:

这组事件API提供了一种当某个指定文件描述符有效或时间到达时执行某个函数的机制.

在使用事件API前必须使用event_init()初始化.

In order to process events, an application needs to call

为了能够处理事件,应用程序必须调用event_dispatch(),该函数只当错误时返回,这时应该由用应程序接管事件.

函数event_set()

(原型

event_set(struct event *ev, int fd, short event,

void (*fn)(int, short, void *), void *arg);

)

用于生成事件结构体ev,以备event_add()和event_del()使用.事件驱动程序将会调用void (*fn)(int, short, void *)中fn指定的函数,并传递三个参数int:文件描述符,short:事件类型,void*:其它参数由arg参数指定.

int fd 指定要监视的文件描述符,

short event 可以是EV_READ,EV_WRITE或EV_READ|EV_WRITE表示该文件可以无阻塞地进行读写.

fn函数将会被调用,并传递给三个变量:

int fd:触发事件的文件描述符.

short event:触发事件的类型EV_TIMEOUT,EV_SIGNAL, EV_READ, or EV_WRITE.

void* :由arg参数指定的变量.

另外重复注册的事件将会产生重复的事件通知.EV_PERSIST可以让注册的事件在执行完后不被删除,直到调用event_del()删除.

结构体初始化完成后,在无需改变内容的情况下,可以被event_add(),event_del()重复使用.但是当结构体被event_add()添加之后,必须保持结构体的内容,直到事件被执行后退出或调用event_del()删除该事件.不允许将这个结构体变量注册完事件后重复使用.每一个描述符都需要一个单独的event结构体变量.

event_add()函数使通过event_set()设置的事件在事件匹配或超时时(如果设置了超时)被执行.

event结构体变量必须先用event_set()初始化过,并且在事件被删除前不得再次调用event_set()来初始化之.如果事件发生超时,旧的超时时间会被新的超时时间所取代.

event_del()函数会取消event结构体所指定的事件,如果该事件已经执行或没有注册(在事件链表中不存在),该函数不会产生任何作用.

evtimer_set(), evtimer_add(), evtimer_del(),evtimer_initialized() evtimer_pending()等函数()用于设置定时或超时操作.在这些函数中,文件描述符为-1,事件类型为EV_TIMEOUT.

signal_set(), signal_add(), signal_del(),signal_initialized(),signal_pending()等函数从略,其中事件类型为EV_SIGNAL.那就意味着signal_set() 添加了EV_PERSIST.

为了避免信号竞争,事件API提供了两程变量:event_sigcb 和 event_gotsig.某个信号的句柄设置event_gotsig表示收到信号.应用程序把event_sigcb设置成一个回调函数.当信号句柄设置了

event_gotsig之后,event_dispatch函数会执行回调函数处理接收到的信号.当没有事件注册时回调函数返回1.回调函数可以返回-1表示错误,这将导致event_dispatch()结束,错误代码为EINTR.

函数跟相似,但是它只调用回调函数一次,并且不需要调用者准备event结构体变量.该函数支持EV_TIMEOUT,EV_READ, andEV_WRITE.

event_pending()用于检测event结构体变量指定的事件是否处于等待状态.如果设定了EV_TIMEOUT,并且tv结构体指针变量非空,则事件终止时间由tv返回.

event_initialized()用于检测event结构体变量是否已经初始化.

event_loop提供一个接口用于单向执行等待事件.EVLOOP_ONCE和 EVLOOP_NONBLOCK有效.调用event_loopexit函数从事件循环中退出.在结定时间超时后下一个event_loop()重复将会正常完成然后不再等待事件直接退出.之后的event_loop()调用将会被正常执行.调用event_loopbreak函数直接从事件循环中退出. 下一个事件完成后event_loop()会中止退出.event_loopbreak()典型的是被事件回调函数调用,这个特性类似于执行了break;语句.之后的event_loop()调用会正常进生

初始化event结构体变量中的回调函数是程序调用者必须提供的.



事件优先级

默认情况下,libevent以相同的优先级调度法动的事件.但是有时候希望以较其它事件更高的优先级处理某些事件.正因为如此,libevent支持精确的优先级队列.优先级值较低活动事件总是比优先级值较高的活动事件.

不同的优先级别可以使用event_priority_init()函数来初始化.该函数必须在之前调用.event_priority_set()函数用于设置事件的优先级.默认情况下libevent把所有事件的优先级设置成中间值,除非它们的优先级被明确指定.



线程安全事件

Libevent支持线程安全,当初始化事件库时调用event_init(),返回一个事件根基event base.这个事件根基可以被event_base_set(),event_base_dispatch(), event_base_loop(), event_base_loopexit(),bufferevent_base_set() andevent_base_free().等函数共同使用.

event_base_set()应该在event_set()初始化之后调用,因为函数event_set()对最近创建的事件根基赋值.在调用bufferevent_new()初始化缓存事件之后应该调用bufferevent_base_set().当不再需要事件根基时应该调用函数释放内存.



缓存事件

libevent 提供正常事件回调的一个抽象.这个抽象叫缓存事件.缓存事件提供输入输出缓存自动写入和读出.使用缓存事件的程序员不再需要直接处理IO,而是通过读写输入输出缓存.



bufferevent_new()使用创建新的缓存事件.

(原型:

struct bufferevent *

bufferevent_new(int fd, evbuffercb readcb, evbuffercb writecb, everrorcb,

void *cbarg);

)

int fd:要读写数据的文件描述符.访文件描述符不允许是管道

接下来三个参数是回调:读写回调函数原型void (*cb)(struct bufferevent *bufev, void *arg)

错误处理回调函数原型:void (*cb)(struct bufferevent *bufev, short what, void *arg)

其中arg参数由cbarg指定.读写回调函数可以是NULL,错误处理回调函数必须指定.

一旦初始化,缓存事件结构体可以被bufferevent_enable(),bufferevent_disable()重复使用.标志参数可以是EV_READ和EV_WRITE.当文件可读时缓存试图从文件描述符中读取数据然后调用回调函数.当缓存中的数据少于写的最低"水位线"时,写回调函数被调用.该最低"水位线"默认为0.

bufferevent_write()用于往文件中写入数据.该数据被自动释放到输出缓冲区,当文件可写时写入文件描述符.该函数成功返回0,失败返回-1.

bufferevent_read()用于读取输入缓冲区中的数据,返回读取的字节数.

如果使用多个事件根基,bufferevent_base_set()函数必须在延缓一次使能缓存事件时调用.



无阻塞HTTP支持

libevent支持所有轻量级的HTTP层,可以且来作HTTP服务器也可以用来发HTTP请求.

HTTP服务器可以使用来创建calling evhttp_new().

也可以用evhttp_bind_socket()绑定所有端口和地址.当HTTP服务器不再使用时,可以调用evhttp_free()释放.

要收到HTTP请求,用户应该注册一个HTTP服务器回调,可以用 evhttp_set_cb()来实现.该函数的第二个参数是回调函数注册的URI.相应的回调会收到一个evhttp_request的结构体对象,它包含请求的所有信息.

这里不有将所有函数调用一一介绍,请参考event.h查看API接口.
分享到:
评论

相关推荐

    学习libevent入门电子书

    《学习libevent入门电子书》是一本针对libevent这一开源事件库的学习资料,它对于深入理解和使用libevent具有极大的价值。libevent是一个高度可移植的库,它为编写高性能、异步网络应用提供了基础。在现代软件开发,...

    libevent参考手册(中文版)_libevent-2.1.5-beta.pdf

    以上是基于给定文件内容整理的libevent相关知识点,由于篇幅限制,并未对每个知识点进行详尽的解释。如果需要深入了解某个具体API的使用或具体实现细节,建议查阅官方提供的完整文档和API参考手册。

    libevent.zip_libevent

    在标题“libevent.zip_libevent”中,“libevent”是核心关键词,表明这是一个与libevent相关的压缩包文件。描述中提到“libevent服务器端代码”,意味着这个压缩包包含了用于构建服务器端应用程序的源码,这些代码...

    libevent vs2013工程以及demo

    5. 添加 Libevent 相关的源文件到项目,并链接相应的库(通常为 libevent.lib 或 libevent_core.lib 和 libevent_extra.lib)。 6. 解决可能出现的编译器警告和错误,确保所有依赖项都已正确配置。 **Libevent 的...

    LibeventBook

    由于Libevent手册的内容较多,以下仅是一部分Libevent相关的知识点总结: 1. 异步IO简介:Libevent支持异步IO操作,能够在不需要阻塞的情况下处理网络和文件事件。这对于需要高吞吐量和高响应性的服务器应用尤其...

    libevent-2.0.20-stable.tar.gz

    安装memcached时,如果缺少libevent,系统可能会抛出错误,提示需要安装libevent相关依赖。这是因为memcached依赖libevent来实现高效的事件驱动网络通信。libevent为memcached提供了一种非阻塞I/O模型,使得...

    libevent2手册_libevent2_

    例如,`event_base_new()`用于创建新的事件基,`event_new()`用于创建事件,`event_set()`用于设置事件的回调函数和相关参数,`event_add()`和`event_del()`则分别用于将事件添加到事件基或从事件基中移除。...

    libevent源码分析

    相关结构体和操作函数是libevent处理信号事件的关键部分,如信号捕捉函数和信号事件的激活机制。 10. event_base配置 配置event_base结构体可以对libevent进行精细的定制,包括后端选择、CPU个数智能调整等。 11. ...

    libevent-devel-1.4.13-4.el6.x86_64.rpm.rar

    描述中的"都放在压缩包里了"暗示我们拥有libevent相关的多个组件,包括文档、开发库以及头文件。 首先,我们来看libevent的主要功能。libevent提供了一种方式来组织应用程序,使其能高效地处理大量并发事件,如网络...

    libevent-devel-2.0.21-4.el7.x86_64.rpm

    在实际开发中,libevent-devel包含的头文件允许程序员在代码中引用libevent的相关接口,如`#include <event2/event.h>`。库文件则让编译器知道如何链接libevent的函数,使得开发者可以利用libevent的功能编写高并发...

    libevent-2.0.22-stable在windows环境下使用mingw编译

    遇到问题时,应检查错误信息并查阅相关文档或在线资源解决。 - 对于特定的Windows版本,可能需要调整编译选项,例如处理Winsock API的差异。 - 安装和使用第三方库时,务必遵循开源许可证条款。 **总结** 通过这个...

    libevent 多线程 HTTP post服务器

    "libeventTest" 这个文件名可能是测试代码或者示例项目的名称,可能包含libevent库的配置、编译、多线程处理HTTP POST请求的示例代码,以及相关的测试用例。 **详细知识点:** 1. **libevent库**:libevent是一个...

    Libevent源码和资料合集

    这个“Libevent源码和资料合集”包含了Libevent的核心源代码以及相关的学习资源,对于深入理解和使用Libevent至关重要。 Libevent 的主要功能是通过事件驱动模型来管理非阻塞I/O。它支持多种事件模型,包括epoll...

    libevent对应Android下的库文件

    - `libevent_pthreads.a`:多线程支持库,libevent提供了线程安全的接口,这个库可能包含了与POSIX线程(pthreads)相关的功能。 在实际开发中,开发者根据项目需求选择链接这些库中的一个或多个,并通过NDK的JNI...

    Libevent源码分析 pdf文档 带目录

    为了适应不同编译器的特点,event-config.h还提供了编译器相关宏的定义。以__func__宏为例,在GCC中,它提供了当前函数的名字,而Microsoft Visual Studio使用__FUNCTION__宏来完成相同的功能。event-config.h通过...

    libevent2.0.4 for linux

    最后,运行`make install`将编译好的库和相关文件安装到系统默认的位置,通常是`/usr/local`下的头文件和库文件。 **标签详解:**"libevent2.0.4 for Linux" 标签重复了标题信息,强调了这是关于libevent的一个...

    libevent 2.0.13

    4. 内建HTTP服务器和客户端接口,方便构建Web服务相关应用。 5. SSL/TLS支持,确保数据传输的安全性。 6. 时间事件管理,用于定时任务执行。 7. 支持多线程编程,允许多个线程同时处理事件。 **三、VS2008解决方案...

    libevent-master.zip

    **相关知识点详解:** 1. **事件驱动编程**:libevent 的核心在于事件驱动模型,它允许程序在等待多个事件发生时,无需轮询检查每个事件的状态,而是通过注册事件处理器,当事件发生时自动触发回调函数。 2. **...

    可在wp8下运行的libevent代码

    这两个标签对于寻找在wp8平台上进行libevent相关开发的开发者来说,是非常重要的指示。 **压缩包文件名:** "libevent-for-wp8-master" 文件名暗示了这是一个针对wp8的libevent主分支(master分支)代码,通常意味...

    【最新】C++ 使用libEvent实现http的post, get功能

    文件名`console2`可能表示这是一个与控制台交互相关的示例代码,可能包含了如何在命令行中输入HTTP请求并显示响应结果的代码片段。通过阅读和理解这个示例,你可以更好地理解libEvent在实际项目中的应用。 总之,...

Global site tag (gtag.js) - Google Analytics