之前提到使用libev开发服务器相对较容易,用户只需要向感兴趣的事件注册回调函数。回调函数中的参数有 struct ev_loop 和 struct ev_io .
先来看看struct ev_io 这个类型
typedef struct ev_io
{
EV_WATCHER_LIST (ev_io)
int fd; /* ro */
int events; /* ro */
};
看看 EV_WATCHER_LIST 的定义
#define EV_WATCHER_LIST(type) \
EV_WATCHER (type) \
struct ev_watcher_list *next;
再看看EV_WATCHER的定义
#define EV_WATCHER (type) \
int active; /* private */ \
int pending; /* private */ \
EV_DECL_PRIORITY /* private */ \
EV_COMMON /* rw */ \
EV_CB_DECLARE (type) /* private */
再看看ev_watcher_list的定义
typedef struct ev_watcher_list
{
EV_WATCHER_LIST (ev_watcher_list)
} ev_watcher_list;
struct ev_io 结构公开的字段有 fd 和 events, 其他字段libev内部使用。
struct ev_loop 这个类型内部结构并没有对用户开放struct ev_loop
{
ev_tstamp ev_rt_now;
#define ev_rt_now ((loop)->ev_rt_now)
#define VAR(name, decl) decl;
#include "ev_vars.h"
#undef VAR
};
ev_vars.h 这个文件里面都是一些 VARx 和 VAR 宏,通过宏展开用来定义一些变量和函数,比较多,暂不一一分析。