[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


如上內容均爲本身總結,不免會有錯誤或者認識誤差,若有問題,但願你們留言指正,以避免誤人,如有什麼問題請留言,會盡力回答之。若是對你有幫助不要忘了分享給你的朋友或者點擊右下方的「在看」哦!也能夠關注做者,查看歷史文章而且關注最新動態,助你早日成爲一名全棧工程師!

微信掃一掃加羣全棧技術交流, 一塊兒討論一塊兒進步!


相關文章
相關標籤/搜索