【Linux】【网络】Libevent基础

server/2025/2/22 23:04:13/

【Linux】【网络】Libevent基础

libevent 是轻量级 c语言实现的 网络io库 能够跨平台 且线程安全 是单线程的
libevent 的使用过程通常包括几个主要步骤:

  • 1.创建Libevent实例
  • 2.注册事件、添加事件、设置处理事件回调函数
  • 3.启动事件循环
  • 4.清理资源

1. 创建Libevent实例 (event_base)

在使用 libevent 时,首先需要创建一个 event_base 对象,它负责管理事件的循环和事件的分发。每个 event_base 可以管理多个事件。

  • 关键函数

    • event_base_new():创建一个新的事件基础(event_base)。
    • event_base_free():释放 event_base 对象。
    struct event_base *base = event_base_new();
    if (!base) {perror("Unable to create event base");return 1;
    }
    

2.注册事件、添加事件、设置处理事件回调函数

2.1注册事件、添加事件到事件循环

接下来,用户需要创建事件对象event),这些事件会被注册到事件循环中。事件对象表示一个具体的 I/O 操作(例如,监听文件描述符的读取、写入)或者定时任务。

  • 关键函数

    • event_new():创建一个新的事件对象。
    • event_add():将事件添加到事件循环中。
    • event_del():从事件循环中删除事件。
    • event_free():释放事件对象。
    struct event *ev = event_new(base, fd, EV_READ | EV_PERSIST, on_event, NULL);
    event_add(ev, NULL);
    

源码实现event_new() 会创建一个事件对象,并根据提供的文件描述符和事件类型(读、写、信号等)进行初始化。底层会根据 event_base 的选择来调度相应的 I/O 多路复用机制(如 epollkqueue)。

2.2设置处理事件回调函数

当事件发生时,libevent 会调用注册的回调函数。回调函数中处理相应的业务逻辑(例如,读取数据、写入数据、处理信号等)。

  • 关键函数

    • 事件对象创建时传入的回调函数:例如上面 on_event
    void on_event(evutil_socket_t fd, short what, void *arg) {// 事件处理逻辑printf("Event triggered!\n");
    }
    

源码实现:回调函数是用户传入的处理函数,libevent 会在合适的时机(例如文件描述符变为可读/可写,定时器到期等)触发回调。

3. 启动事件循环 (event_base_dispatch)

创建并注册完事件后,接下来就是启动事件循环。事件循环会持续运行,直到所有事件都处理完成。libevent 会调用底层的 I/O 多路复用机制(如 epoll_wait()kqueue())来等待事件的发生。

  • 关键函数

    • event_base_dispatch():启动事件循环并开始处理事件。
    • event_base_loop():也是启动事件循环的函数,提供更多控制选项。
    event_base_dispatch(base)`; //event_base_new() 创建的event_base Libevent实例
    

源码实现event_base_dispatch() 会调用 eventop->dispatch(),即具体的 I/O 多路复用机制(如 epollkqueue)。它会等待文件描述符的事件发生,并调用相应的事件回调函数。

4.事件清理

在不再需要某个事件时,需要删除该事件,防止内存泄漏或逻辑错误。libevent 提供了清理事件的接口。

  • 关键函数

    • event_del():删除事件。
    • event_free():释放事件对象。
    • event_base_free():释放 event_base
    event_del(ev);
    event_free(ev);
    event_base_free(base);
    

源码实现

  • event_del() 会event_del() 的作用是从事件基础(event_base)中删除一个已经注册的事件。删除事件意味着该事件将不再参与事件循环,也不会被触发。
  • event_free() 释放事件对象的内存,在调用 event_del() 删除事件后,event_free() 会释放事件对象所占的内存
  • event_base_free() event_base_free() 用于释放 event_base 对象,它会释放事件基础结构中的所有事件,并清理与之相关的资源。event_base 是事件系统的核心,它管理着所有的事件和底层 I/O 多路复用机制。

5. 定时器事件

libevent 支持定时器事件,可以在指定时间后触发回调函数。定时器事件通常用于周期性任务或者延迟任务。

  • 关键函数

    • event_add():为定时器事件指定时间间隔。
    • event_new():创建定时器事件。
    struct event *ev = event_new(base, -1, EV_PERSIST, on_timer, NULL);
    struct timeval one_second = {1, 0};  // 每秒触发一次
    event_add(ev, &one_second);
    

源码实现:定时器事件的处理使用了 event_add() 来将定时器事件与事件循环关联。libevent 会使用底层的 selectpoll 等机制来管理定时器事件,并通过系统定时器触发事件。

总结

libevent 的核心流程是:创建事件基础 (event_base),创建事件对象 (event)并将其添加到事件循环(event_add())中,启动事件循环 (event_base_dispatch()) 处理事件,回调处理事件,然后清理资源。

这些步骤在源码中主要通过以下接口实现:

  • 事件基础创建与释放event_base_new(),event_init() ,event_base_free()
  • 事件创建与添加event_new(), event_add(), event_del()
  • 事件循环event_base_dispatch(), event_base_loop()
  • 回调处理:用户定义的回调函数
  • 定时器处理event_add(), event_new()
  • 事件清理event_del(), event_free(), event_base_free(base);

后面会写一下libevent 内核实现和reactor模式


http://www.ppmy.cn/server/169630.html

相关文章

LINUX安装使用Redis

参考 Install Redis on Linux | Docs 安装命令 sudo apt-get install -y lsb-release curl gpgcurl -fsSL https://packages.redis.io/gpg | sudo gpg --dearmor -o /usr/share/keyrings/redis-archive-keyring.gpgsudo chmod 644 /usr/share/keyrings/redis-archive-keyrin…

2025最新面试自用题库---面试使用

2025最新面试自用题库---面试使用 1、css中如何实现水平垂直居中方法一:flex:方法二:绝对定位margin:auto:方法三:已知子元素宽高(200*200) 绝对定位 负margin方法四:已知子元素宽高(200*200) 绝对定位 calc方法五…

Docker+Dify部署DeepSeek-r1本地知识库

安装配置Docker Desktop 软件下载 Docker Desktop版本:4.38.0.181591 Docker Desktop下载地址:Docker: Accelerated Container Application Development 或者从这里下载:DockerDesktop-4.38.0.181591资源-CSDN文库 点击图下所示位置,下载windows-AMD64版本软件 启用Hy…

第4章 4.2 Entity Framework Core基础 EF Core 入门

本节介绍EF Core的基本用法及注意事项 4.2.1 该选择什么数据库 EF Core 支持所有主流的数据库。 本书介绍的是SQL Server ,因为是微软亲儿子,所以EF Core对SQL Server的支持非常全面。 4.2.2 EF Core环境搭建 1. 安装Microsoft.EntityFrameworkCore…

Compose 常用UI组件

Compose 常用UI组件 概述Modifier 修饰符常用Modifier修饰符作用域限定Modifier Modifier 实现原理Modifier.Element链的构建链的解析 常用基础组件文字组件图片组件按钮组件选择器对话框进度条 常用布局组件线性布局帧布局 列表组件 概述 Compose 预置了很多基础组件&#xf…

AI赋能Web3.0前端开发:效率革命与ScriptEcho的实践

Web3.0浪潮席卷全球,前端开发作为用户体验的关键环节,面临着前所未有的挑战。如何高效、低成本地构建复杂的去中心化应用(DApps)成为行业关注的焦点。幸运的是,AI写代码工具的兴起为Web3.0前端开发带来了新的曙光&…

android调用ffmpeg解析rtsp协议的视频流

文章目录 一、背景二、解析rtsp数据1、C层功能代码2、jni层的定义3、app层的调用 三、源码下载 一、背景 本demo主要介绍android调用ffmpeg中的接口解析rtsp协议的视频流(不解析音频),得到yuv数据,把yuv转bitmap在android设备上显…

接入DeepSeek后,智慧园区安全调度系统的全面提升

随着人工智能技术的快速发展,智慧园区的安全管理正逐步向智能化、自动化方向迈进。DeepSeek作为先进的人工智能解决方案,为智慧园区安全调度系统注入了强大的技术动力。通过接入DeepSeek,智慧园区安全调度系统在多个方面实现了显著提升&#…