加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

Libevent学习-----Reactor的事件处理机制

发布时间:2020-12-15 07:17:39 所属栏目:百科 来源:网络整理
导读:1.普通函数的调用机制: 主程序调用某函数à函数执行,保存入参和返回寄存器地址,主程序等待à 函数处理完将结果和控制权返回给主程序 à主程序继续执行 void func (){ return;}int main(int argc,char *argv[]){ int a,b; func(); -------主程序调用func函

1.普通函数的调用机制:

主程序调用某函数à函数执行,保存入参和返回寄存器地址,主程序等待à 函数处理完将结果和控制权返回给主程序 à主程序继续执行

void func ()
{
                return;
}
int main(int argc,char *argv[])
{
                int a,b;
                func();  -------主程序调用func函数时,必须等待func执行完以后才能继续执行后续的代码
              a = 1;
              b = 2;
}


2.Reactor, 中文的意思是“反应堆”, 是一种事件驱动机制。

应用程序不是主动调用某个函数完成处理,而是将函数以回调函数的方式注册到Reactor上,如果相应的事件发生了,Reactor将主动调用注册的函数。

3.Reactor模式整体框架



1) Reactor----反应堆

Reactor是事件管理的接口,将事件注册到事件多路分发器上,然后在事件多路分发器上等待事件的发生,当有事件发生时,调用注册的事件回调函数处理事件。

2) eventdemultiplexer ----事件多路分发器

是一个函数,用来等待一个或多个事件的发生。调用者会被阻塞,直到分发器上有事件发生。一般是I/O多路复用机制,比如select,poll和epoll等。

3) Handle------(事件源)

用于识别每一个事件,如socket描述符、文件描述符、信号等

4) EventHandler-----事件处理程序

事件处理程序提供了一组接口,每一个接口对应一种类型的事件

5) ConcreteEvent Handler-----具体的事件处理器

这个是Event Handler接口的具体实现。每一个具体的事件处理器通常和一个描述符相关。

Libevent对应的实现

1) Reactor反应堆

Libevent里面的反应堆,对应的是Struct event_base 结构

2)eventdemultiplexer ----事件多路分发器

struct event_base {
	const struct eventop *evsel;    ---------对应io的事件多路分发器—epoll
	……
	const struct eventop *evsigsel; --------对应信号的事件多路分发器 evsigops
	……
};

3)Handle------(事件源)

struct event {
	……
	evutil_socket_t ev_fd; ------------------对应的事件
	……
};


4) Event Handler-----事件处理程序

struct event {
	……
	void (*ev_callback)(evutil_socket_t,short,void *arg);----- 事件处理程序
	……
}


4) ConcreteEvent Handler-----具体的事件处理器

event_new(struct event_base *base,evutil_socket_t fd,short events,void (*cb)(evutil_socket_t,void *),void *arg)

调用event_new时候添加的回调函数cb

Event_new函数完成了

1、event结构的内存分配;

2、设置可所属的event_base;

3、初始化了event结构;

4、设置了fd,events,cb和arg等参数

Libevent整体处理流程:

1)首先调用struct event_base *base = event_base_new(); 创建一个反应堆

2) 调用event_new产生event结构,并将handler(fd)和具体事件处理器cb放入event结构中,完成Handler和事件处理器的赋值,并且将event与event_base相关联

3)调用event_add将event注册到事件多路分发器eventdemultiplexer

4)调用event_base_dispatch,等待事件多路分发器返回激活事件,然后调用对应事件的事件处理函数

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读