libev学习笔记
1.什么是libev?
libev是一个强大的网络reactor,支持多种事件(信号,I/O,定时器…..)
1 | //基本数据类型的宏定义 |
2.使用方法
1.创建ev_loop对象
1 | struct ev_loop *ev_loop_new(unsigned int flag); |
2.绑定用户数据以及reactor的开始与退出
1 | void ev_set_userdata(EV_P_ void *data); |
3.设置轮询时间
1 | //在event_loop里面我们还关心一件事情,就是每次event_loop轮询的时间长短。通常来说这个不会是太大问题,但是在高性能情况下面我们需要设置 |
4.Watcher
watcher 相当于eventhandler,一般ev_loop用于创建libev里面的reactor对象,而watcher就是事件触发后处理事件的模块,通常绑定fd,以及发生事件后处理事件的回调函数,下列的type用于区分不同的watcher
watcher的状态
initialiased 已经初始化
active 调用start进行注册
pending 已经触发事件但是还没有处理
inactive 调用stop注销.这个状态和已经初始化是一样的
1
2
3
4
5
6
7
8
9
10
11
12typedef void (*)(struct ev_loop *loop, ev_TYPE *watcher, int revents) callback; // callback都是这种类型
ev_init (ev_TYPE *watcher, callback); // 初始化watcher
ev_TYPE_set (ev_TYPE *watcher, [args]); // 设置watcher
ev_TYPE_init (ev_TYPE *watcher, callback, [args]); // 通常使用这个函数最方便,初始化和设置都在这里
ev_TYPE_start (loop, ev_TYPE *watcher); // 注册watcher
ev_TYPE_stop (loop, ev_TYPE *watcher); // 注销watcher
ev_set_priority (ev_TYPE *watcher, int priority); // 设置优先级
ev_feed_event (loop, ev_TYPE *watcher, int revents); // 这个做跨线程通知非常有用,相当于触发了某个事件。
bool ev_is_active (ev_TYPE *watcher); // watcher是否active.
bool ev_is_pending (ev_TYPE *watcher); // watcher是否pending.
int ev_clear_pending (loop, ev_TYPE *watcher); // 清除watcher pending状态并且返回事件
5.实例
1 | //一个简单的io驱动事件 |
6.和epoll对比
ev_loop相当于struct event_base *base,监听集合
watcher相当于struct event *event,但是相比于epoll中的event,watcher中设置了相应的回调函数。
ev_run相当于epoll_wait函数开始监听事件的到来,到事件到来的时候调用相应的回调函数处理相应的事件