源码阅读 libevent - 工作流程分析
之前的小节讲了很多 libevent
的基础构件,现在以一个实际例子来初步探究 libevent
的基本工作流程。
libevent 工作流程分析
#include<stdio.h>
#include<event.h>
#include<thread.h>
void cmd_cb(int fd, short events, void *arg) {
char buf[1024];
printf("in the cmd_cb\n");
read(fd, buf, sizeof(buf));
}
int main() {
evthread_use_pthreads();
// 使用默认的 event_base 配置
struct event_base *base = event_base_new();
struct event *cmd_ev = event_new(base, STDIN_FILENO,
EV_READ | EV_PERSIST, cmd_cb, NULL);
event_add(cmd_ev, NULL); // 没有超时
event_base_dispatch(base);
return 0;
}
这个例子非常简单,却已经包含了 libevent
的基础工作流程:
event_base_new()
event_new()
event_add()
event_base_dispatch()
evthread_use_pthreads
evthread_use_pthreads()
开启多线程支持。
event_base_new
event_base_new()
构造一个 event_base
对象。
event_new
event_new()
创建一个 event
事件。
event_add
event_add()
将 event
事件加入到 event_base
对象中。
event_base_dispatch
event_base_dispatch()
开始监听 event
事件发生。
源码学习流程
该博客文章建议阅读顺序
- 源码阅读 libevent - 初识 Hello World
- 源码阅读 libevent - 日志模块
- 源码阅读 libevent - 内存管理
- 源码阅读 libevent - 多线程:锁和条件变量
- 源码阅读 libevent - 多线程:调试锁
- 源码阅读 libevent - 数据结构:双向链表
- 源码阅读 libevent - 数据结构:尾队列
- 源码阅读 libevent - 数据结构:哈希表
- 源码阅读 libevent - 结构体:event_io_map
- 源码阅读 libevent - 结构体:event_signal_map
- 源码阅读 libevent - 创建 event_base
- 源码阅读 libevent - 结构体:event
- 源码阅读 libevent - 结构体:event_once
- 源码阅读 libevent - 事件主循环
- 源码阅读 libevent - 数据结构:小根堆
- 源码阅读 libevent - 超时管理:min_heap
- 源码阅读 libevent - 信号事件处理
- 源码阅读 libevent - 工作流程分析
- 源码阅读 libevent - 优先级管理
- 源码阅读 libevent - 时间管理
待完成文章
因为有新系列文章计划,该系列文章仍会持续更新,但不会很频繁了。
- 源码阅读 libevent - 超时管理:common timeout
- 源码阅读 libevent - 通知机制
- 未完待续
其他资料整理
本文是我在阅读源码过程中,对自己学习情况的一个记录,学习过程中参考了很多资料,也对所有资料的作者表示感谢: