[Nodejs原理] 事件驱动异步IO的真正奥秘之Libuv入门(Hello World篇)

Libuv是什么?

1. 简介

Libuv是一个高性能的,事件驱动的异步I/O库,它自己是由C语言编写的,具备很高的可移植性。libuv封装了不一样平台底层对于异步IO模型的实现,因此它还自己具有着Windows, Linux均可使用的跨平台能力。

Libuv专为Node.js而设计,可是后来由于它这种事件驱动的异步IO的高效模型逐步被不少语言和项目都采纳而做为自身的底层库而使用,像 Luvit, Julia, pyuv, 还有不少基于它的项目 [1]

2. Libuv历史

Nodejs刚出来的时候,底层并非使用libuv,而是libev,libev自己也是一个异步IO的库,可是它只能在POSIX [2]系统下使用。随着nodejs被愈来愈多人使用,因为windows的用户量巨大,因此开始考虑Nodejs的跨平台能力。
这时候Nodejs提供了libuv来做为抽象封装层,在Unix系统上,经过封装libev和libio调用linux的epoll 或 kqueue,在Windows 平台上的IOCP [3]进行封装,自此以后Nodejs具有了跨平台能力,由Libuv做为中间层自己提供的跨平台的抽象,来根据系统决定使用libev/libio或IOCP,后来在node-v0.9.0版本中,libuv移除了libev的内容。

Libuv的特色

•全功能的事件循环基于epoll、kqueue、IOCP、event portsnode

•异步的TCP和UDP套接字linux

•异步的DNS解析git

•异步的文件和文件系统操做github

•文件系统事件•ANSI转义代码控制的TTYvim

•PC包括套接字共享,使用Unix域套接字或有名管道(Windows)windows

•子进程bash

•线程池微信

•信号处理异步

•高分辨率时钟oop

•线程和同步原语

Libuv入门实战之Hello world

笔者是MacOS的系统,其余操做系统能够查看官方安装文档[4],接下下来介绍一下 libuv的安装与使用。

1、安装libuv

1.下载libuv的源码

git clone https://github.com/libuv/libuv.git复制代码

2.下载完成后进入项目,依次执行下面命令,进行编译安装,遇到问题 能够在libuv的ISSUE[5] 下寻找答案或者留言提问。

sh autogen.sh
./configure
make
make check
make install复制代码

3.安装完成后,查看一下本身本地 /usr/local/include/ 下是否有uv.h等头文件,若是存在即安装完成。

4.查看静态连接库文件/usr/local/lib/libuv.a 是否存在。

2、libuv的Hello word

下述示例默认有c语言环境,能够输入gcc验证一下,没有c环境的话请搜索安装gcc环境。这边的hello world参考的文档里推荐的入门示例[6]

1.新建文件 main.c。

vim main.c复制代码


2.文件写入以下内容。

// main.c
#include <stdlib.h>
#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;
}复制代码

3.若是提示没有uv.h,能够试试下面的头替代。

#include </usr/local/include/uv.h>复制代码

4.执行编译连接命令。

gcc -o main main.c  -luv
或者
gcc -o main main.c  /usr/local/lib/libuv.a复制代码

5.执行可执行文件 ./main 进行验证。

6.程序解释:首先uv_loop_init开启了一个loop,uv_run执行,可是loop是空的,没有要处理的事件,而后很快uv_loop_close退出。


目前一个使用libuv作的入门实例已完成,接下来笔者将会解析一下内部的Api,作一些实例分享出来,有兴趣的请关注笔者微信公众号哦 。

References

[1] Projects that use libuv:

https://github.com/libuv/libuv/wiki/Projects-that-use-libuv

[2] 是一套操做系统 API 规范。通常而言,遵照 POSIX 规范的操做系统指的是 UNIX、Linux、Mac OS X 等:
[3] Windows 平台上的内核事件通知相应的机制Input/Output Completion Port:
[4] 安装文档:
https://github.com/libuv/libuv#build-instructions

[5] ISSUE:
https://github.com/libuv/libuv/issues

[6] 入门示例:
https://github.com/luohaha/Chinese-uvbook/blob/master/source/basics_of_libuv.md#hello-world


如上内容均为本身总结,不免会有错误或者认识误差,若有问题,但愿你们留言指正,以避免误人,如有什么问题请留言,会尽力回答之。若是对你有帮助不要忘了分享给你的朋友或者点击右下方的“在看”哦!也能够关注做者,查看历史文章而且关注最新动态,助你早日成为一名全栈工程师!

微信扫一扫加群全栈技术交流, 一块儿讨论一块儿进步!


相关文章
相关标签/搜索