libevent入门和使用

libevent是什么?

   libevnet是一个事件驱动框架,提供一种处理机制,当fd有事件发生或超时时执行回调函数;同时libevent支持posix信号和普通超时回调。libevent的目标就是要取代事件驱动server的事件循环。应用仅仅需要调用event_dispatch(),接着就可以在不改变事件循环的情况下增加删除事件。libevent提供统一的event api来封装底层事件机制,比如select,poll,epoll,kqueue等。libevent可以使用在多线程环境中,一种方法是一个线程只能访问event_base,另一种方式是多个线程加锁访问一个event_base。libevent事件框架也是典型的Reactor模式,event封装了fd和fd事件处理函数,event_base处理多个event,对应Reactor。libevnet还是一个缓冲网络io的高级框架,支持sockets, filters, rate-limiting, SSL, zero-copy file transmission, and IOCP。libevent还支持几个有用的协议,包括dns,http,rpc框架。


之后的代码分析以libevent-1.4.14b-stable版本为准,底层多路复用机制分析epoll。

libevent源码分析,只专注于I/O读写事件和超时事件,对signal不做分析。

libevnet的事件框架和reids的事件框架类似。


libevent使用例子

1)首先初始化libevent库,并保存返回的指针

struct event_base * base = event_init();

实际上这一步相当于初始化一个Reactor实例;在初始化libevent后,就可以注册事件了。

 

2)初始化事件event,设置回调函数和关注的事件

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,对fd要关注的事件,事件的处理函数;

 

3)设置event从属的event_base

event_base_set(base, &ev);

这一步相当于指明event要注册到哪个event_base实例上;

 

4)添加事件,底层调用epoll_ctl

event_add(&ev, timeout);    //   timeout是定时值;

 

5)程序进入无限循环,等待就绪事件并执行事件处理,底层调用epoll_wait

event_base_dispatch(base);

 

参考:

 官方网站:http://libevent.org/

书籍programming with libevent:http://www.wangafu.net/~nickm/libevent-book/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值