Libuv是什么?1. 简介
libuv是一个高性能的,事件驱动的异步i/o库,它本身是由c语言编写的,具有很高的可移植性。libuv封装了不同平台底层对于异步io模型的实现,所以它还本身具备着windows, linux都可使用的跨平台能力。
![[Nodejs原理] 核心库Libuv入门(Hello World篇)](https://img.php.cn/upload/article/001/503/042/175789512872945.jpg)
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的内容。
![[Nodejs原理] 核心库Libuv入门(Hello World篇)](https://img.php.cn/upload/article/001/503/042/175789512810654.jpg)
笔者是MacOS的系统,其他操作系统可以查看官方安装文档[4],接下下来介绍一下 libuv的安装与使用。
一、安装libuv1.下载libuv的源码
代码语言:javascript代码运行次数:0运行复制<pre class="brush:php;toolbar:false;">git clone https://github.com/libuv/libuv.git
2.下载完成后进入项目,依次执行下面命令,进行编译安装,遇到问题 可以在libuv的ISSUE[5] 下寻找答案或者留言提问。
代码语言:javascript代码运行次数:0运行复制<pre class="brush:php;toolbar:false;">sh autogen.sh./configuremakemake checkmake install
3.安装完成后,查看一下自己本地 /usr/local/include/ 下是否有uv.h等头文件,如果存在即安装完成。
![[Nodejs原理] 核心库Libuv入门(Hello World篇)](https://img.php.cn/upload/article/001/503/042/175789512870663.jpg)
4.查看静态链接库文件/usr/local/lib/libuv.a 是否存在。
![[Nodejs原理] 核心库Libuv入门(Hello World篇)](https://img.php.cn/upload/article/001/503/042/175789512974686.jpg)
下述示例默认有c语言环境,可以输入gcc验证一下,没有c环境的话请搜索安装gcc环境。这边的hello world参考的文档里推荐的入门示例[6]。
1.新建文件 main.c。
代码语言:javascript代码运行次数:0运行复制<pre class="brush:php;toolbar:false;">vim main.c
2.文件写入如下内容。
代码语言:javascript代码运行次数:0运行复制<pre class="brush:php;toolbar:false;">// 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,可以试试下面的头替代。
代码语言:javascript代码运行次数:0运行复制<pre class="brush:php;toolbar:false;">#include </usr/local/include/uv.h>
4.执行编译链接命令。
代码语言:javascript代码运行次数:0运行复制<pre class="brush:php;toolbar:false;">gcc -o main main.c -luv或者gcc -o main main.c /usr/local/lib/libuv.a
5.执行可执行文件 ./main 进行验证。
![[Nodejs原理] 核心库Libuv入门(Hello World篇)](https://img.php.cn/upload/article/001/503/042/175789512959765.jpg)
6.程序解释:首先uv_loop_init开启了一个loop,uv_run执行,但是loop是空的,没有要处理的事件,然后很快uv_loop_close退出。
目前一个使用libuv做的入门实例已完成,接下来笔者将会解析一下内部的Api,做一些实例分享出来,有兴趣的请关注笔者微信公众号哦 。
References[1]
[2]
[3]
[4]
[5]
[6]
如上内容均为自己总结,难免会有错误或者认识偏差,如有问题,希望大家留言指正,以免误人,若有什么问题请留言,会尽力回答之。如果对你有帮助不要忘了分享给你的朋友或者点击右下方的“在看”哦!也可以关注作者,查看历史文章并且关注最新动态,助你早日成为一名全栈工程师!
以上就是[Nodejs原理] 核心库Libuv入门(Hello World篇)的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号