libevent学习总结
1. 信息隐藏:看*-internal.h文件
如bufferevent_private结构体在bufferevent_async.c中使用时:
static inline struct bufferevent_async *upcast(struct bufferevent *bev);
2.函数指针:
void (*free_context)(void *);
3.指针:
#define offsetof(s, m) (size_t)&(((s *)0)->m)
s是一个结构名,它有一个名为m的成员(s和m 是宏offsetof的形参,它实际是返回结构s的成员m的偏移地址,(s *)0 是骗编译器说有一个指向类(或结构)s的指针,其地址值0 ,&((s *)0)->m 是要取得类s中成员变量m的地址. 因基址为0,这时m的地址当然就是m在s中的偏移。
4.c语言多态性: void*
5.双链表实现
6.小根堆实现
7.信号处理
信号的处理是通过sockpair处理的,具体初始化如下:
event_base_new->event_base_new_with_config->epoll_init->evsig_init->evutil_socketpair->event_assign(看到evsig_cb了吧,接收信号消息的,使用pair[1])
使用时的调用过程如下:
event_assign->event_add{event_add_internal->evmap_signal_add->evsig_add->_evsig_set_handler(看到了吧,evsig_handler其实是实实在在内部的信号处理函数,这里有send,会将消息发给pair[1],会重新注册此信号事件)->event_add(仅添加一次)->TAILQ_INSERT_TAIL(进入双链表的事件包含我们自己设置的回调函数)}
当evsig_cb接收到信号消息时->evmap_signal_active->event_active_nolock->event_queue_insert->将时间插入到base->activequeues,这样在执行event_base_dispatch时,event_base_loop中的event_process_active就会处理相应的事件啦,而最主要的处理就是执行我们自己设置的回调函数。
8.事件类型:
I/O事件: EV_WRITE和EV_READ 哈希表
定时事件:EV_TIMEOUT 小根堆
信号: EV_SIGNAL 双链表
9.针对一个客户端服务器使用Libevent例子中的libevent执行流程(针对核心函数):
10. 总结
所有的事件按需要注册到:I/O事件,定时事件,信号中。
在event_base_dispatch函数里处理逻辑如下:
1. res = evsel->dispatch(base, tv_p); // 处理IO事件,其实不处理,只把激活的事件向优先队列添加
2. timeout_process(base); // 处理定时事件,其实是不处理,只往优先队列添加
3. event_process_active://处理优先队列事件,包括evsel->dispatch放的事件,信号放过来的事件,以及持久的事件,即超时事件
4. 其中信号事件处理由evmap_signal_add注册的程序独立处理。
libevent学习总结的更多相关文章
- libevent学习之二:Windows7(Win7)下编译libevent
Linux下编译参考源码中的README文件即可,这里主要记录Windows下的编译. 一.准备工作 去官网下载最新的稳定发布版本libevent-2.0.22-stable 官网地址:http:// ...
- PHP中的Libevent学习
wangbin@2012,1,3 目录 Libevent在php中的应用学习 1. Libevent介绍 2. 为什么要学习libevent 3. Php libeven ...
- libevent学习笔记 一、基础知识【转】
转自:https://blog.csdn.net/majianfei1023/article/details/46485705 欢迎转载,转载请注明原文地址:http://blog.csdn.net/ ...
- Libevent学习之SocketPair实现
Libevent设计的精化之一在于把Timer事件.Signal事件和IO事件统一集成在一个Reactor中,以统一的方式去处理这三种不同的事件,更确切的说是把Timer事件和Signal事件融合到了 ...
- libevent学习笔记 —— 牛刀小试:简易的服务器
回想起之前自己用纯c手动写epoll循环,libevent用起来还真是很快捷啊!重写了之前学习的时候的一个例子,分别用纯c与libevent来实现.嗯,为了方便对比一下,就一个文件写到黑了. 纯c版: ...
- Libevent学习笔记(五) 根据例子学习bufferevent
libevent中提供了一个Hello-world.c 的例子,从这个例子可以学习libevent是如何使用bufferevent的. 这个例子在Sample中 这个例子之前讲解过,这次主要看下buf ...
- libevent学习文档(三)working with event
Events have similar lifecycles. Once you call a Libevent function to set up an event and associate i ...
- 【传智播客】Libevent学习笔记(一):简介和安装
目录 00. 目录 01. libevent简介 02. Libevent的好处 03. Libevent的安装和测试 04. Libevent成功案例 00. 目录 @ 01. libevent简介 ...
- Libevent 学习笔记 (1)——Libevent 2.0安装与简单演示样例
今天開始学习Libevent . Libevent 是开源社区的一款高性能I/O框架库. 主要特点有: 1 跨平台. 2 统一事件源 3 线程安全 4 基于Reactor 今天主要进行了Libeven ...
- Libevent学习笔记
学习: /Users/baidu/Documents/Data/Interview/服务器-检索端/libevent参考手册(中文版).pdf 讲的不好.翻译的..
随机推荐
- WebService调用权限验证 SoapHeader
一般在项目中,制作的都是基于SOAP协议的webservices,其描述语言是WSDL.但是有时候在项目中,需要保证webservices的安全,需要对其进行进行验证,那么我们就要实现SoapHead ...
- [Angular Tutorial] 12 -Event Handlers
在这一步中,您将会在电话细节页面添加一个可点击的电话图片转换器. ·电话细节页面展示了当前电话的一张大图片和几张相对较小的略图.如果我们能仅仅通过点击略图就能把大图片换成略图就好了.让我们看看用Ang ...
- WebForm和MVC中都可以使用的路由
1.在global.asax void Application_Start(object sender, EventArgs e) { // 在应用程序启动时运行的代码 // RouteConfig. ...
- UVa 10551 - Basic Remains
题目大意:关于大数的mod和进制转换,直接使用Java的BigInteger类,正在copy式学习中... import java.io.*; import java.util.*; import j ...
- 使用MyEclipse开发第一个Web程序
MyEclipse环境配置 首先,安装一个MyEclipse,然后进行一些相关的环境配置(Window->Preferences): 比如字体.Formatter等. 也可以从Eclipse中导 ...
- 如何在Eclipse下安装myeclipse插件
来自http://www.blogjava.net/show911/archive/2008/04/27/86284.html 下载myeclipse插件 支持eclipse3.1.x, 具体安装步骤 ...
- html 5 本地数据库(Web Sql Database)核心方法openDatabase、transaction、executeSql 详解
Web SQL数据库API实际上不是HTML5规范的组成部分,而是单独的规范.它通过一套API来操纵客户端的数据库.Safari.Chrome. Firefox.Opera等主流浏览器都已经支持Web ...
- Angular - - $rootScope.Scope
这里讲的是一些scope的操作,如创建/注销/各种监听及scope间的通信等等. $rootScope.Scope 可以使用$injector通过$rootScope关键字检索的一个根作用域. 可以通 ...
- 【翻译】使用Visual Studio在Azure上部署Asp.Net Core Web应用
配置运行环境 Install the latest Azure SDK for Visual Studio. The SDK installs Visual Studio if you don't a ...
- jquery动态加载 去除js
!-- 这里为你提供了三种动态加载js的jquery实例代码哦,由于jquery是为用户提供方便的,所以利用jquery动态加载文件只要一句话$.getscript("test.js&quo ...