面试题答案
一键面试1. 初始化
- 数据结构:
struct event_base
:事件循环的核心数据结构,包含了各种与事件处理相关的信息,如时间堆(用于管理定时事件)、事件集合(用于管理监听事件)等。struct event
:表示一个具体的事件,包括事件对应的文件描述符(fd)、事件类型(读、写等)、回调函数等信息。
- 关键函数:
event_base_new()
:创建一个新的event_base
对象,初始化事件循环的环境,包括初始化时间堆、事件集合等相关数据结构。
2. 添加事件
- 数据结构:
- 继续使用
struct event
,在添加事件时,会填充该结构的各个字段,如ev_read
、ev_write
等事件类型,以及ev_callback
回调函数指针。
- 继续使用
- 关键函数:
event_new()
:创建一个新的event
对象,设置其对应的event_base
、文件描述符、事件类型和回调函数等。event_add()
:将创建好的event
对象添加到event_base
的事件集合中,准备监听该事件。
3. 事件循环
- 数据结构:
event_base
中的事件集合(如红黑树等数据结构,用于高效管理事件)和时间堆(用于管理定时事件)在事件循环过程中发挥作用。时间堆会随着时间推移检查定时事件是否到期。
- 关键函数:
event_base_dispatch()
:启动事件循环,该函数会进入一个无限循环,不断检查事件集合中的事件是否就绪(如文件描述符是否可读、可写等)。- 在
event_base_dispatch()
内部,会调用底层的I/O多路复用函数(如select
、poll
、epoll
等,根据不同的平台和编译选项选择),这些函数会阻塞等待事件发生。当有事件发生时,event_base_dispatch()
会获取到就绪的事件列表,并调用相应event
的回调函数ev_callback
来处理事件。
4. 事件处理
- 数据结构:
struct event
中的ev_callback
回调函数指针会指向具体的事件处理函数。在事件处理函数中,可能会根据事件类型(如读事件可能从文件描述符读取数据)进行相应的操作。
- 关键函数:
- 自定义的事件处理函数(即
ev_callback
指向的函数):开发者根据具体需求编写的处理事件的函数,如在处理读事件时,从文件描述符读取数据并进行解析等操作。
- 自定义的事件处理函数(即
5. 清理
- 数据结构:
event_base
和event
对象在使用完毕后需要清理。
- 关键函数:
event_free()
:释放event
对象所占用的资源。event_base_free()
:释放event_base
对象所占用的资源,包括时间堆、事件集合等相关数据结构占用的内存等。