libevent
NB_vol_1
这个作者很懒,什么都没留下…
展开
-
libevent代码阅读(1)
一些概念:1、libevent是一个高性能的io框架,基于Reactor模式2、event_base即Reactor实例3、event是事件处理器(注意event不是事件,而是事件处理器)4、libevent实现了select、poll、epoll、iocp等io复用机制,在编译的时候会自动选择一个最高效io复用机制原创 2015-11-05 16:47:37 · 1432 阅读 · 0 评论 -
libevent代码阅读(12)——event_base中的一些事件处理器容器
1、activequeues。存放被激活的事件,这是一个队列数组(或者说队列的链表),具有相同优先级的被激活的事件存放在同一个队列中,不同优先级的事件存放在不同的队列中。2、eventqueue。存放所有的事件(即注册的事件),不论是信号事件、定时器事件还算一般的io事件,只要被注册了,就放在这里。3、common_timeout_queues。公共的超时事件队列,4、min_heap原创 2015-11-07 15:35:59 · 945 阅读 · 0 评论 -
libevent代码阅读(10)——“hello-world.c”之 把事件处理器添加到event_base对象的注册的事件处理器的队列
事件处理器创建完成之后,需要将它添加到event_base对象的注册的事件处理器的队列中,这样,event_base对象才能在事件多路分发处理当中对该事件进行处理。调用event_add函数把事件处理添加到注册事件处理队列中,该函数的定义如下:// 创建event(事件处理器)并初始化之后// 需要使用event_add将其添加到注册事件队列中intevent_add(struct原创 2015-11-06 17:12:27 · 1016 阅读 · 0 评论 -
libevent代码阅读(14)——select复用机制(一)
libevent实现几种io复用机制,本文将会重点介绍select和epoll模式。selectops(eventop类型)对象是用于操作select复用机制的结构对象,它内部成员都是回调函数等,这些回调函数用于实现select复用机制,定义如下:// select模式的io复用机制const struct eventop selectops = { // 名字 "select",原创 2015-11-07 20:47:23 · 1511 阅读 · 0 评论 -
libevent代码阅读(13)——epoll的事件等待以及分发过程
在前面的章节我们提到event_base_loop中会调用具体的io复用机制的事件等待以及分发函数evsel->dispatch,然后调用event_process_active处理已经激活的事件。对于epoll而言,dispatch就是epoll_dispatch,我们看一下它的执行流程// 事件分发static intepoll_dispatch(struct event_base原创 2015-11-07 16:29:11 · 1825 阅读 · 0 评论 -
libevent代码阅读(11)——“hello-world.c”之 进入事件多路分发循环
前面的操作都完成之后,正式进入事件多路分发循环,在循环,Reactor框架等待事件的发生,然后寻找对应的事件处理器,然后调用对应的事件处理回调函数进行事件的处理,循环会一直运行,直到没有事件.执行事件多路分发循环的函数是event_base_dispatch,它调用的其实是event_base_loop,它定义如下:/* * 事件循环 * 首先调用io事件多路分发器的事件监听函数,等待原创 2015-11-06 17:30:45 · 1318 阅读 · 0 评论 -
libevent代码阅读(6)——“hello-world.c”之 io复用机制
可以看到event_base的创建的过程中,最重要的一步就是选择一个最高效的io复用机制可供选择的io复用机制定义如下:// Reactor初始化的时候会从这里选择最合适的io复用机制static const struct eventop *eventops[] ={ // evport的实现#ifdef _EVENT_HAVE_EVENT_PORTS &evportop原创 2015-11-06 15:44:30 · 921 阅读 · 0 评论 -
libevent代码阅读(15)——epoll复用机制
epollops(eventop类型)对象是用于操作epoll复用机制的结构对象,它内部成员都是回调函数等,这些回调函数用于实现epoll复用机制,定义如下:// io复用机制——epollconst struct eventop epollops = { // 名字 "epoll", // 初始化 epoll_init, // 添加事件 epoll_nochangelist_a原创 2015-11-07 21:11:34 · 1705 阅读 · 0 评论 -
libevent代码阅读(8)——“hello-world.c”之 创建监听器
创建完成event_base之后,调用evconnlistener_new_bind函数来创建监听器:// 创建一个监听器struct evconnlistener *evconnlistener_new_bind(struct event_base *base, // 监听器所属的event_base对象 evconnlistener_cb cb, // 新连接到来的时原创 2015-11-06 16:19:53 · 717 阅读 · 0 评论 -
libevent代码阅读(4)——“hello-world.c”之 ibevent框架的使用流程
从这一章开始,我们将按照hello-world.c程序执行的流程来学习libeventlibevent框架的使用流程:1、构建event_base(Reactor)对象2、创建一个监听器3、创建一个信号处理器4、把信号处理器加入到event_base的注册信号处理器队列中5、进入event_base的事件多路分发循环,如有事件发生,那么就掉用事件处理进行处理6、所有原创 2015-11-06 15:05:18 · 905 阅读 · 0 评论 -
libevent代码阅读(9)——“hello-world.c”之 创建事件处理器
事件处理器由event_new函数来创建,evsignal_new是event_new的特化版本(是事件为EV_SIGNAL|EV_PERSIST的event_new函数调用),event_new定义如下:// 新建一个事件处理器struct event *event_new(struct event_base *base, evutil_socket_t fd, short events原创 2015-11-06 16:53:34 · 805 阅读 · 0 评论 -
libevent代码阅读(7)——“hello-world.c”之 io复用机制的初始化
选择完成最适合的io复用机制之后,就要开始进行初始化设置,即调用eventop的init回调函数,以epoll为例,epoll_init的定义如下:// epoll初始化static void *epoll_init(struct event_base *base){ // epoll的文件描述符 int epfd; // 用于存放epoll的文件描述符以及一些事件 struc原创 2015-11-06 16:05:20 · 646 阅读 · 0 评论 -
libevent代码阅读(5)——“hello-world.c”之 event_base对象的创建
首先在main函数中,我们调用event_base_new函数来创建一个event_base对象,一个event_base对象就是一个Reactor实例。event_base_new函数的流程:1、创建一个config对象2、把config对象作为参数,调用event_base_new_with_config函数来创建一个event_base对象3、释放config对象原创 2015-11-06 15:30:59 · 1212 阅读 · 0 评论 -
libevent代码阅读(3)——入门例子“hello-world.c”的学习
/* * 一个很好的入门例子 * 当客户端链接到服务器的时候,服务器简单地向客户端发送一条“Hello, World!”消息,然后等待客户端关闭 * 服务器不接受客户端发送的数据 */#include #include #include #include #ifndef WIN32#include # ifdef _XOPEN_SOURCE_EXTENDED# incl原创 2015-11-06 09:40:26 · 1679 阅读 · 1 评论 -
libevent代码阅读(2)——尾队列的学习
libevent当中大量使用了linux内置的一个数据结构——尾队列下面是它的使用方法:#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include u原创 2015-11-05 20:42:02 · 1082 阅读 · 0 评论 -
libevent代码阅读(16)——缓冲区
在hello-world的listener_cb函数中,我们看到该函数使用一个bufferevent对象(缓冲区事件),使用bufferevent的好处就是不用直接调用io操作函数即可进行读写,往缓冲区中写入数据就是往文件(或者套接字)中写入数据,从缓冲区中读取数据就是从文件或者套接字中读取数据。不仅如此,bufferevent还有很好的缓冲功能。bufferevent的定义如下:/*原创 2015-11-08 15:45:02 · 1526 阅读 · 0 评论