1.event结构体
上次提到了Libevent中的事件处理器是event结构体类型。下面介绍Libevent中的各种结构体。
event结构体的成员:
ev_events。它代表是事件类型
event_next。所有已注册的事件处理器通过该成员串联成一个尾队列,我们称之为注册事件队列。
ev_active_next。所有被激活的事件处理器通过该成员串联成一个尾队列,称之为活动事件队列
ev_timeout_pos是一个联合体,它仅用于定时事件处理器。
_ev是一个联合体用来串联I/O事件队列和信号事件队列。
ev_fd。对于I/O事件处理器来说它是文件描述符值。对信号事件处理器来说,它是信号量。
ev_base当前事件处理器从属的base.
ev_res。记录当前激活事件的类型。
ev_flags。是事件标志。
ev_pri指事件处理器的优先级。
2.往注册事件队列中添加事件处理器
前面提到,创建一个event对象是一个event_new函数,该函数的实现主要是给event对象分配空间并初始化它的成员。
创建完一个event对象要将事件处理器添加到注册事件队列。并将对应的事件添加到事件多路分发器中。由函数event_add实现,函数event_add主要是调用一个内部函数event_add_internal。
函数event_add_internal内的函数evmap_io_add。该函数将I/O事件添加到事件多路分发器,并将对应的事件处理器添加到I/O事件队列中,同时建立I/O事件和I/O事件处理器之间的映射关系。
evmap_signal_add。该函数将信号事件添加到事件多路分发器中,并将对应的事件处理器添加到信号事件队列中,同时建立信号事件和信号事件处理器之间的映射关系。
event_queue_insert。该函数将事件处理器添加到各种事件队列。将I/O事件处理器和信号事件处理器插入注册事件队列;将定时器插入通用定时器队列或时间堆。将激活的事件处理器添加到活动事件队列中。
3.往事件多路分发器种注册事件
event_queue_insert函数所做的仅仅是将一个事件处理器加入event_base的某个事件队列中。对于新加入的I/O事件处理器和信号事件处理器我们还要让事件多路分发器来监听对应的事件,同时建立文件描述符,信号值与事件处理器之间的映射关系。这要通过evmap_io_add和evmap_signal_add完成。
4.
eventop结果提封装了I/O复用机制必要的一些操作,比如注册事件、等待事件等。它为event_base支持的所有后端I/O复用机制提供了同一的接口。
event_base是Libevent中的Reactor
事件循环即为Libevent的"动力",Libevent中实现事件循环的函数是event_base_loop。该函数首先带哦用I/O事件多路分发器的事件监听函数,以等待事件;一旦有事件发生,就依次处理。