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 讲的不好.翻译的..
随机推荐
- Struts2配置dtd约束
Struts2和Struts1的区别: 一.elclipse-ee开发 搭建环境eclipse-ee 1.加入jar包 apps/struts2-blank.war解压 2.在web.xml文件中配 ...
- iOS 解决一个复杂bug 之 计分卡
由于该模块界面和业务逻辑都很复杂,并且整个界面设计和业务逻辑都在ViewController(下面简称为VC)里面完成.该VC共有3000多行,一个函数几百张的也有.所以,解决起来真是头疼. 1. 问 ...
- Selenium IE6 Failed to load the library from temp directory: C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\IED1C1.tmp
项目中用到了使用Selenium打开IE浏览器.前期都是基于IE8+.Firefox.Chrome.项目后期开始现场测试时发现大部分客户还都是使用的Windows XP + IE6.结果可想而知,直接 ...
- 解决NetStream.appendBytes直播爆音的问题解决
研究了一下Adobe家HDS的具体实现 OSMF.利用其中的一个核心方法 flash.net.NetStream.appendBytes()构建了我们自己的HTTP点直播播放框架.但今年年初发现一个问 ...
- C# 泛型初探
初探的类: public class TClass { /// <summary> /// int参数 /// </summary> /// <param name=&q ...
- 深圳尚学堂:Android APP的测试流程
每一个新开发的软件都避免不了测试,我在这里总结了一些Android系统的移动端APP测试的一些测试流程,希望可以给大家一些帮助. 1. UI 测试App主要核ui与实际设计的效果图是否一致:交互方面的 ...
- [CSS3] 学习笔记-选择器详解(二)
1.选择器first-child.last-child.nth-child和nth-last-child 利用first-child.last-child.nth-child和nth-last-chi ...
- WinForm 对话框、流
一.对话框 ColorDialog:颜色选择控件 private void button1_Click(object sender, EventArgs e) { //显示颜色选择器 colorDia ...
- 光荣与梦想 | XMove动作捕捉系统(一)
XMove是我和几个死党从2010年开始开发的一套人体动作捕捉系统,软硬件全部自行开发,投入了大量的精力,历经三年,发展四个版本. 今年春节回到老家,翻出了2011年春节时焊电路用过的松香和和硬盘角落 ...
- HTML5学习之语义化标签(一)
一.为什么HTML5要引入新语义标签 在HTML5出现之前,我们一般采用DIV+CSS布局我们的页面.但是这样的布局方式不仅使我们的文档结构不够清晰,而且不利于搜索引擎爬虫对我们页面的爬取.为了解决上 ...