poll io是nodejs非常重要的一个阶段,文件io、网络io、信号处理等都在这个阶段处理。这也是最复杂的一个阶段。处理逻辑在uv__io_poll这个函数。这个函数比较复杂,我们分开分析。 开始说poll io之前,先了解一下他相关的一些数据结构。 1 io观察者uv__io_t。这个结构体是poll io阶段核心结构体。他主要是保存了io相关的文件描述符、回调、感兴趣的事件等信息。 2 watcher_queue观察者队列。所有需要libuv处理的io观察者都挂载在这个队列里。libuv会逐个处理。 我们看如何初始化一个io观察者
代码语言:javascript复制// 初始化io观察者
void uv__io_init(uv__io_t* w, uv__io_cb cb, int fd) {
// 初始化队列,回调,需要监听的fd
QUEUE_INIT(&w->pending_queue);
QUEUE_INIT(&w->watcher_queue);
w->cb = cb;
w->fd = fd;
// 上次加入epoll时感兴趣的事件,在执行完epoll操作函数后设置
w->events = 0;
// 当前感兴趣的事件,在再次执行epoll函数之前设置
w->pevents = 0;
}
我们再看一下如何注册一个io观察到libuv。