libev是一个高效的事件库,用来统一信号、定时器、文件IO、网络等需要异步处理的操作方式,提供统一的异步处理框架。以下是官方手册的一个例子:
手册原文地址:http://doc.dvgu.ru/devel/ev.html
libev中包括刚才所举的几个内容,都被认为是一种TYPE,经过封装他们的使用方式非常的相似。上图代码中使用到了两种TYPE:io和timer。从main开始看,ev_default_loop创建了一个默认的循环结构,这个结构贯穿后续的使用。io和timer都分别经历了ev_TYPE_init和ev_TYPE_start两个步骤。
ev_TYPE_init代表了①初始化watcher②注册回调函数③设置关注动态,它实质上是调用了ev_init和ev_TYPE_set两个函数来实现的,我们当然可以拆开来自行分别调用。
watcher是对应每种TYPE的一个结构,可以在实例代码4、5行看到,它的内部数据我们并不需要过多关注,也不能随意修改。官方手册中提到一种用法,就是扩充这个结构体多传递一些自己关注的数据。具体可以查找关键字“ASSOCIATING CUSTOM DATA WITH A WATCHER”
回调函数的形态都是一样的void (*cb)( struct ev_loop *loop, struct ev_TYPE *w, int revents); 其中ev_TYPE代表了初始时的那个watcher。
最后设置,是根据不同的TYPE有不同的参数和参数个数传入的。所以需要事先结合自己的需求了解要设置哪些参数。在手册“WATCHER TYPES”子标题下有单独的讲述。
接下来是ev_TYPE_start,相当于将watcher关联到loop,这样这个loop可以产生对watcher的通知。
ev_loop()这个函数会使线程陷进去,直到ev_unloop被调用。在此期间发生的通知产生的回调,都会是主线程执行的。在多线程环境下搞清楚这一点会比较有意义。
(libev使用宏定义将ev_loop即定义成函数,又定义成结构体)
(与ev_loop等效的函数还有ev_run、ev_run1等,在此不多叙述)