[Nodejs原理] 核心库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 ports?異步的TCP和UDP套接字?異步的DNS解析?異步的文件和文件系統操作?文件系統事件?ANSI轉義代碼控制的TTY?PC包括套接字共享,使用Unix域套接字或有名管道(Windows)?子進程?線程池?信號處理?高分辨率時鐘?線程和同步原語
Libuv入門實戰之Hello world
筆者是MacOS的系統,其他操作系統可以查看官方安裝文檔[4],接下下來介紹一下 libuv的安裝與使用。
一、安裝libuv
1.下載libuv的源碼
git clone https://github.com/libuv/libuv.git2.下載完成后進入項目,依次執行下面命令,進行編譯安裝,遇到問題 可以在libuv的ISSUE[5]?下尋找答案或者留言提問。
sh autogen.sh./configuremakemake checkmake install? 3.安裝完成后,查看一下自己本地 /usr/local/include/ 下是否有uv.h等頭文件,如果存在即安裝完成。
??? 4.查看靜態鏈接庫文件/usr/local/lib/libuv.a 是否存在。
二、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.執行編譯鏈接命令。
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
如上內容均為自己總結,難免會有錯誤或者認識偏差,如有問題,希望大家留言指正,以免誤人,若有什么問題請留言,會盡力回答之。如果對你有幫助不要忘了分享給你的朋友或者點擊右下方的“在看”哦!也可以關注作者,查看歷史文章并且關注最新動態,助你早日成為一名全棧工程師!
總結
以上是生活随笔為你收集整理的[Nodejs原理] 核心库Libuv入门(Hello World篇)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 酒店股票龙头一览表
- 下一篇: 欢迎使用CSDN-markdown编辑器