当前位置: 首页 > news >正文

【Linux】【网络】Libevent基础

【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模式

相关文章:

  • React入门 – 1. 学习React的预备知识
  • JVM内存模型详解
  • 数据结构-双向链表
  • 面试题之Vuex,sessionStorage,localStorage的区别
  • Qt常用控件之按钮QPushButton
  • 解决 `pip is configured with locations that require TLS/SSL` 错误
  • 使用DeepSeek+本地知识库,尝试从0到1搭建高度定制化工作流(数据分析篇)
  • RabbitMQ 3.12.2:单节点与集群部署实战指南
  • lab3 CSAPP:AttackLab
  • PosgreSQL比MySQL更优秀吗?
  • nlp|微调大语言模型初探索(2),训练自己的聊天机器人
  • 算法与数据结构(最小栈)
  • Python Cookbook-1.21 在Unicode和普通字符串之间转换
  • 【Python 语法】Python 正则表达式(regular expressions, regex)
  • 代码随想录 第一章 数组 977.有序数组的平方
  • 【拒绝算法PUA】LeetCode 1287. 有序数组中出现次数超过25%的元素
  • 30填学习自制操作系统第二天
  • 从MySQL迁移到PostgreSQL的完整指南
  • 【Elasticsearch】硬件资源优化
  • 下载安装运行测试开源vision-language-action(VLA)模型OpenVLA
  • A股午后回暖,三大股指涨跌互现:港口板块重新走强,两市成交近1.1万亿元
  • 海南乐城管理局原局长贾宁已赴省政协工作,曾从河南跨省任职
  • 美国前总统拜登确诊前列腺癌
  • 著名文博专家吴远明因交通事故离世,享年75岁
  • 长三角体育节回归“上海时间”,首次发布赛事旅游推荐线路
  • 北京警方:海淀发生小客车刮碰行人事故4人受伤,肇事司机已被查获