libev学习
知识基础:
·c++
1.libev简介
Libev是一个event loop:向libev注册感兴趣的events,比如Socket可读事件,libev会对所注册的事件的源进行管理,并在事件发生时触发相应的程序。
2.原理
通过event watcher来注册事件,watcher是一个结果体。
libev通过分配和注册watcher对不同类型的事件进行监听。不同事件类型的watcher又对应不同的数据类型,watcher的定义模式是struct ev_TYPE或者ev_TYPE,其中TYPE为具体的类型。当前libev定义了如下类型的watcher:
ev_io
ev_timer
ev_periodic
ev_signal
ev_child
ev_stat
ev_idle
ev_prepare and ev_check
ev_embed
ev_fork
ev_cleanup
ev_async
3.实例分析
下面是一个libev使用的例子,通过注册io类型的watcher来监视STDIN可读事件的发生:
//回调函数
static void my_cb (struct ev_loop*loop, ev_io *w, int revents)
{
ev_io_stop (w);
ev_break (loop, EVBREAK_ALL);
}
//设置预制的全局驱动器
struct ev_loop *loop = ev_default_loop(0);
//初始化和设置触发条件
ev_io stdin_watcher;,
ev_init (&stdin_watcher, my_cb);
ev_io_set (&stdin_watcher,STDIN_FILENO, EV_READ);
ev_io_start (loop, &stdin_watcher);
//开始循环
ev_run (loop, 0);
上面的示例代码中用到的与watcher相关的函数有ev_init,ev_io_set,ev_io_start,ev_io_stop。ev_init对一个watcher的与具体类型无关的部分进行初始化。ev_io_set对watcher的与io类型相关的部分进行初始化,显然如果是TYPE类型那么相应的函数就是ev_TYPE_set。可以采用ev_TYPE_init函数来替代ev_init和ev_TYPE_set。ev_io_start激活相应的watcher,watcher只有被激活的时候才能接收事件。ev_io_stop停止已经激活的watcher。
event loop的概念。示例程序中的ev_run、ev_break以及ev_loop_default都是event loop控制函数。event loop定义为struct ev_loop。有两种类型的event loop,分别是default类型和dynamically created类型,区别是前者支持子进程事件。ev_default_loop和ev_loop_new函数分别用于创建default类型或者dynamically created类型的event loop。
event_run函数告诉系统应用程序开始对事件进行处理,有事件发生时就调用watchercallbacks。除非调用了ev_break或者不再有active的watcher,否则会一直重复这个过程。