Libevent库的简介

一、libevent是什么

Libevent 是一个用C语言编写的、轻量级的开源高性能事件通知库,主要有以下几个亮点:事件驱动( event-driven),高性能;轻量级,专注于网络,不如 ACE 那么臃肿庞大;源代码相当精炼、易读;跨平台,支持 Windows、 Linux、 *BSD 和 Mac Os;支持多种 I/O 多路复用技术, epoll、 poll、 dev/poll、 select 和 kqueue 等;支持 I/O,定时器和信号等事件;注册事件优先级。Libevent 已经被广泛的应用,作为底层的网络库;

二、图示

我们需要自己实现的是注册事件,注销事件。事件循环就相当于select/poll的循环调用,事件循环启动以后,libevent的实例就会去检测描述符上的事件有没有产生(调用I/O方法如select,poll,epoll),检测描述符上的事件有没有产生,如果有事件产生,调用回调函数。
在这里插入图片描述

三、一个实例

在这里插入图片描述在这里插入图片描述

  1. event _base_dispatch函数来执行事件循环
  2. 事件循环结束后,使用*_free系列函数来释放系统资源。
  3. event add函数,将事件处理器添加到注册事件队列中

四、libevent支持的事件类型

在这里插入图片描述
EV_PERSIST永久事件的作用:事件触发后,自动重新对这个event调用event_add函数。

五、事件处理流程

在这里插入图片描述

  1. 首先应用程序准备并初始化 event,设置好事件类型和回调函数;
  2. 向 libevent 添加该事件 event。对于定时事件,libevent 使用一个小根堆管理,key 为超时时间;对于 Signal 和 I/O 事件,libevent 将其放入到等待链表(wait list)中,这是一个双向链表结构;
  3. 开启循环 程序调用 event_base_dispatch()系列函数进入无限循环,事件多路分发器检测那三个容器里有没有就绪就绪事件,如果有,就把他放到激活链表中,然后调用回调函数,进行事件处理。多路分发器实际上就是I/O函数。以 select()函数为例;每次循环前 libevent 会检查定时事件的最小超时时间 tv,根据 tv 设置 select()的最大等待时间,以便于后面及时处理超时事件;当 select()返回后,首先检查超时事件,然后检查 I/O 事件;

当三个容器同时为空时或者程序员主动退出时,会退出

Libevent 将所有的就绪事件,放入到激活链表中;然后对激活链表中的事件,调用事件的回调函数执行事件处理;如果事件不是永久事件,当从事件处理器中移到激活链表中之后就不存在了,之后也就无法检测了;永久性事件会再次将其添加到事件处理器中(调用event_new)。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值