【Linux】【网络】Libevent基础
- IT业界
- 2025-09-03 16:12:02

【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 多路复用机制(如 epoll、kqueue)。
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 多路复用机制(如 epoll、kqueue)。它会等待文件描述符的事件发生,并调用相应的事件回调函数。
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 会使用底层的 select、poll 等机制来管理定时器事件,并通过系统定时器触发事件。
总结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模式
【Linux】【网络】Libevent基础由讯客互联IT业界栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“【Linux】【网络】Libevent基础”