libevent使用

libevent使用步骤:

1.//初始化event管理实例

ev_base = event_base_new();

event_base_new里做了如下工作:

1、 申请内存

2、 初始化定时器堆和事件队列

3、 为event_base对象选择底层事件函数封装对象。根据编译选项,初始化eventops全局对象。该对象存放指向底层select/pool/epoll等功能的封装函数。

4、 初始化活动队列。

2.//创建event事件

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

其中void (*cb)(evutil_socket_t, short, void *)为事件触发调用的回调函数

3.//添加event事件到event_base全局管理对象中

int event_add(struct event *ev, const struct timeval *tv)

作用:

增加指定event到监控池里。

1、 对于读、写、信号事件,调用封装的add函数,调用底层select/pool/epoll相关函数,增加到操作系统事件监控里。对于epoll,调用的是epoll_add函数。Epoll_add函数调用epoll_ctl添加事件监控,libevent使用水平触发方式。把监听时间加入到event_base的事件队列中。

2、 对应定时器事件,加入到event_base的定时器最小堆里。

3、 对信号事件,调用evsignal_add,加入事件处理队列中。

4.//循环事件

int event_base_dispatch(struct event_base *event_base)

只需调用一次,后面的事件只需event_add就行

作用:

事件循环,事件发生后,调用相应回调函数。

1、 计算最近的超时时间:定时器最小堆按照超时时间排序,取最小的超时时间;如已有活动事件或指定不阻塞,超时时间为0。

2、 调用dispatch。对epoll,对应epoll_dispatch函数。该函数调用epoll_wait监控指定事件。

3、 把到了超时时间的时间加入到活动事件队列。从超时时间最小堆中依次取最小超时时间和当前时间比较,对小于/等于当前时间的事件,加入到活动事件队列。

4、 循环调用活动事件队列中所有事件的回调函数。

 

epoll_dispatch:

1.      计算epoll_wait函数需要的超时时间,把时间转换成微妙。

2.      如epoll_wait被信号中断,把相应信号对应的事件加入到活动事件队列。

3.      如监视的描述上发生了特定事件,把相应事件对象加入到活动事件队列。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值