一起玩玩libuv (一)

libuv是一个轻量级的异步IO库,学习它这件事情已经打算好久了,那么从今天开始,我尝试使用libuv写一些教程性质的代码

1.下载与编译

github上clone下源码,编译lib库。

> cd libuv/
> ./autogen.sh
> ./configure
> make

编译之后会在.libs文件夹存在libuv.a的库文件,当前根目录下有include头文件夹。

2.Hello World

#include <stdio.h>
#include <stdlib.h>
#include <uv.h>

int main() {
    uv_loop_t *loop = malloc(sizeof(uv_loop_t));
    uv_loop_init(loop);

    printf("Now quitting.\n");
    uv_run(loop, UV_RUN_DEFAULT);

    uv_loop_close(loop);
    free(loop);
    return 0;
}

loop需要手动的分配空间,并在结束的时候释放空间。
uv_run用于运行主循环,但在主循环里面其实什么都没做就又跳出主循环了,简单讲一下为什么。

int uv_run(uv_loop_t* loop, uv_run_mode mode) {
      int timeout;
      int r;
      int ran_pending;

      r = uv__loop_alive(loop);
      if (!r)
        uv__update_time(loop);

      while (r != 0 && loop->stop_flag == 0) {
          ....
      }
      ....
      return r;
  }

此时loop里面都是空的,在uv__loop_alive函数中有如下判断:

static int uv__loop_alive(const uv_loop_t* loop) {
      return uv__has_active_handles(loop) ||
             uv__has_active_reqs(loop) ||
             loop->closing_handles != NULL;
}

此时上面三个判断条件都不满足,因此r为0,不会进入while循环,直接跳出uv_run函数。

3.Reference

  1. An Introduction to libuv - http://nikhilm.github.io/uvbook/