libevent学习笔记四:Libevent整体处理流程
前面介绍了基本概念、Reactor模式等,为了进一步的深入学习,本节从基本使用场景和代码的整体处理流程入手进一步深入学习。
1 、基本流程
使用libevnet的基本流程,实际上是 libevent基本应用场景,也就是使用livevent设置定时器等,然后执行附带的几个要求的步骤,应用程序只需要执行下面几个简单的步骤即可。
1)初始化libevent库,获得返回的指针
struct event_base * base = event_init();
即初始化一个Reactor实例;初始化libevent后,接下来就可以注册事件了。
2)初始化事件event,设置回调函数和事件,并自动关联。
evtimer_set(&ev, timer_cb, NULL);
这个等价于调用下面的方法
event_set(&ev, -1, 0, timer_cb, NULL);
event_set的函数原型是:
void event_set(struct event *ev, int fd, short event, void (*cb)(int, short, void *), void *arg)
各参数的具体说明如下:
ev:执行要初始化的event对象;
fd:该event绑定的句柄,对于信号事件,它就是关注的信号;
event:在该fd上关注的事件类型,它可以是EV_READ, EV_WRITE, EV_SIGNAL;
cb:这是一个函数指针,当fd上的事件event发生时,调用该函数执行处理,它有三个参数,调用时由event_base负责传入,按顺序,实际上就是event_set时的fd, event和arg;
arg:传递给cb函数指针的参数;
由于定时事件不需要fd,并且定时事件是根据添加时(event_add)的超时值设定的,因此这里event也不需要设置。相当于初始化一个event handler,在libevent中事件类型保存在event结构体中。需要强调的是libevent并不会管理event事件集合,需要应用程序自行管理;
3)设置event从属的event_base
event_base_set(base, &ev);
在这里指明了event要注册到哪个event_base实例上;
4)添加事件
event_add(&ev, timeout);
前面基本信息都已设置完成,剩下的就是简单的调用event_add()函数即可完成,其中timeout是定时值;相当于调用Reactor::register_handler()函数注册事件。
5)程序进入无限循环处理过程,等待就绪事件并执行事件处理
event_base_dispatch(base);
2、实例代码
前面文字介绍的流程和处理步骤,综合下来就是下面一段代码:
struct event ev;
struct timeval tv;
void time_cb(int fd, short event, void *argc)
{
printf("timer wakeup/n");
event_add(&ev, &tv); // reschedule timer
}
int main()
{
struct event_base *base = event_init();
tv.tv_sec = 10; // 10s 时间间隔
tv.tv_usec = 0;
evtimer_set(&ev, time_cb, NULL);
event_add(&ev, &tv);
event_base_dispatch(base);
}
3、事件处理流程说明
当应用程序向libevent注册一个事件后,按照下面的图就给出的逻辑执行基本流程。
1)第一步应用程序准备并初始化event,设置好事件类型和回调函数;
2)向libevent添加该事件event。对于定时事件,libevent使用一个小根堆管理,key为超时时间;对于Signal和I/O事件,libevent将其放入到等待链表(wait list)中,这是一个双向链表结构;
3)程序调用event_base_dispatch()系列函数进入无限循环,等待事件,以select()函数为例;每次循环前libevent会检查定时事件的最小超时时间tv,根据tv设置select()的最大等待时间,以便于后面及时处理超时事件;
当select()返回后,首先检查超时事件,然后检查I/O事件;
Libevent将所有的就绪事件,放入到激活链表中;
然后对激活链表中的事件,调用事件的回调函数执行事件处理;
4、总结
上面介绍了libevent的简单实用场景和基本流程,很简单的说明了libevent的事件处理流程,以使学习者对libevent有了基本的概念,后面汇总介绍libevent的事件管理框架(即:Reactor模式中的Reactor框架)再做详细的介绍。