libevent学习笔记
NMG_CJS
公众号:曹李序员
知乎:空杯
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
libevent学习笔记四——timer小根堆
二叉堆的基本结构 libevent使用二叉堆来管理timer事件,其key值为超时时间,二叉堆是一颗被完全填满的二叉树,最底层可能有例外,且底层元素都是从左到右填入的。 考虑到完全二叉树的规律性,其很容易使用数组来表示,libevent也是使用数组的方式来表示的,小根堆的结构体如下: typedef struct min_heap { struct event** p; // 指向二叉堆根节点...原创 2019-04-27 19:12:48 · 874 阅读 · 0 评论 -
libevent学习笔记三——活跃事件管理
激活列表基本结构 libevent激活列表使用双向链表数据结构实现,其按优先级存放活跃事件,具体结构如下图: libevent在结构体struct event_base中维护了优先级双向队列头struct evcallback_list *activequeues数组,其下标越小表示优先级越高。各数组成员指向了双向链表的头和尾如下图所示: 激活列表基本操作 该宏用于声明一个表示双向列表头的结构...原创 2019-05-29 20:35:52 · 481 阅读 · 0 评论 -
libevent学习笔记一——初始化
一、初始化libevent库 base = event_base_new(); 该函数所做主要工作: 1)、调用接口min_heap_ctor_(&base->timeheap)初始化小根堆,libevent使用小根堆来管理超时事件; 2)、初始化活跃事件链表,libevent将满足条件的超时事件、IO/Signal事件插入活跃链表,稍后按优先级依次执行; TAILQ_INIT(&a...原创 2019-07-13 16:08:26 · 458 阅读 · 0 评论 -
libevent学习笔记六——集成定时器事件到事件主循环
Libevent版本2.1.8(超链接),参考源码time-test.c 1、使用以下两个接口初始化event库,并且初始化一个event struct event_base * event_base_new(void); Int event_assign(struct event *ev, struct event_base *base, evutil_socket_t fd, short ev...原创 2019-07-10 22:25:39 · 447 阅读 · 0 评论 -
Libevent学习笔记二——事件管理
概述 在libevent中,事件分为3类:IO、signal和超时事件,其中IO和signal事件采用链表来管理,超时事件采用小根堆来管理; 具体实现 在此以IO事件为例讲解libevent事件管理: libevent中结构体struct event_base base的成员变量struct event_io_map io用于管理IO事件。 #define event_io_map event_s...原创 2019-07-24 21:50:17 · 487 阅读 · 0 评论 -
libevent学习笔记五——socketpair
socket既可以用于网络通信也可以用于进程间通信,libevent为了将信号事件集成到其自身的事件管理系统中采用了socketpair的机制,socketpair简言之就是在本地创建了一对用于通信的socket,libevent采用如下接口创建socketpair。 int evutil_socketpair(int family, int type, int protocol, evutil_...原创 2019-08-03 09:37:39 · 1052 阅读 · 0 评论 -
libevent学习笔记七——集成信号事件到事件主循环
概述 在linux系统中有现成的信号捕获接口如sigaction,它可以捕获指定的信号并执行用户自定义信号处理函数,那么如何将这种机制集成到libevent事件管理模型中呢? libevent采用了socketpair的方式将信号事件集成到了其自身的事件处理模型中。 具体做法如下简述: 初始化socketpair; 调用接口sigaction设置指定信号的信号处理函数,该信号处理函数所做工作为向...原创 2019-07-27 18:31:51 · 415 阅读 · 0 评论
分享