libevent学习笔记
NMG_CJS
公众号:曹李序员
知乎:空杯
展开
-
libevent学习笔记四——timer小根堆
二叉堆的基本结构libevent使用二叉堆来管理timer事件,其key值为超时时间,二叉堆是一颗被完全填满的二叉树,最底层可能有例外,且底层元素都是从左到右填入的。考虑到完全二叉树的规律性,其很容易使用数组来表示,libevent也是使用数组的方式来表示的,小根堆的结构体如下:typedef struct min_heap{ struct event** p; // 指向二叉堆根节点...原创 2019-04-27 19:12:48 · 784 阅读 · 0 评论 -
libevent学习笔记三——活跃事件管理
激活列表基本结构libevent激活列表使用双向链表数据结构实现,其按优先级存放活跃事件,具体结构如下图:libevent在结构体struct event_base中维护了优先级双向队列头struct evcallback_list *activequeues数组,其下标越小表示优先级越高。各数组成员指向了双向链表的头和尾如下图所示:激活列表基本操作该宏用于声明一个表示双向列表头的结构...原创 2019-05-29 20:35:52 · 367 阅读 · 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 · 361 阅读 · 0 评论 -
libevent学习笔记六——集成定时器事件到事件主循环
Libevent版本2.1.8(超链接),参考源码time-test.c1、使用以下两个接口初始化event库,并且初始化一个eventstruct 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 · 371 阅读 · 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 · 385 阅读 · 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 · 879 阅读 · 0 评论 -
libevent学习笔记七——集成信号事件到事件主循环
概述在linux系统中有现成的信号捕获接口如sigaction,它可以捕获指定的信号并执行用户自定义信号处理函数,那么如何将这种机制集成到libevent事件管理模型中呢?libevent采用了socketpair的方式将信号事件集成到了其自身的事件处理模型中。具体做法如下简述:初始化socketpair;调用接口sigaction设置指定信号的信号处理函数,该信号处理函数所做工作为向...原创 2019-07-27 18:31:51 · 321 阅读 · 0 评论