[Nodejs原理] 核心库Libuv入门(Hello World篇)

Libuv是什么?1. 简介

libuv是一个高性能的,事件驱动的异步i/o库,它本身是由c语言编写的,具有很高的可移植性。libuv封装了不同平台底层对于异步io模型的实现,所以它还本身具备着windows, linux都可使用的跨平台能力。

[Nodejs原理] 核心库Libuv入门(Hello World篇)

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篇)

Libuv的特点Libuv入门实战之Hello world

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

一、安装libuv

1.下载libuv的源码

代码语言:javascript代码运行次数:0运行复制

git clone https://github.com/libuv/libuv.git

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

代码语言:javascript代码运行次数:0运行复制

sh autogen.sh./configuremakemake checkmake install

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

[Nodejs原理] 核心库Libuv入门(Hello World篇)

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

[Nodejs原理] 核心库Libuv入门(Hello World篇)

二、libuv的Hello word

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

文心大模型 文心大模型

百度飞桨-文心大模型 ERNIE 3.0 文本理解与创作

文心大模型 56 查看详情 文心大模型

1.新建文件 main.c。

代码语言:javascript代码运行次数:0运行复制

vim main.c

2.文件写入如下内容。

代码语言:javascript代码运行次数:0运行复制

// main.c#include #include #include #include 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运行复制

#include 

4.执行编译链接命令。

代码语言:javascript代码运行次数:0运行复制

gcc -o main main.c  -luv或者gcc -o main main.c  /usr/local/lib/libuv.a

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

[Nodejs原理] 核心库Libuv入门(Hello World篇)

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篇)的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/587652.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年11月10日 13:57:51
下一篇 2025年11月10日 14:03:18

相关推荐

  • 误提交大文件到Git仓库怎么办?如何安全删除远程仓库中的大型文件夹?

    避免误提交大文件到Git仓库及安全删除远程仓库大型文件夹 不小心将大型文件夹提交到远程Git仓库,导致克隆和拉取速度极慢?本文提供安全删除远程仓库大型文件夹的方法,避免影响团队协作。 解决方案: 在执行任何操作前,务必确认删除远程文件夹不会影响其他开发人员的工作及项目正常运行。 本地删除: 使用以下…

    2025年12月11日
    000
  • ThinkPHP控制器不存在问题:class_exists()方法为何在Linux系统下大小写敏感?

    ThinkPHP框架下控制器不存在的疑难杂症:Linux系统中的大小写敏感性 ThinkPHP框架会将控制器名(例如:GetType)转换为小写加首字母大写形式(GetType)。然而,class_exists() 方法在理论上不应区分大小写。 实际应用中,我们常常使用如下代码判断控制器是否存在: …

    2025年12月11日
    000
  • ThinkPHP控制器不存在:大小写敏感与自动加载机制冲突的原因是什么?

    ThinkPHP控制器加载失败:大小写敏感与自动加载冲突详解 ThinkPHP框架中,控制器命名采用驼峰式命名法,但在自动加载过程中可能会出现大小写敏感问题导致控制器找不到的情况。例如,控制器AppIndexControllerGetType在内部会被转换为Gettype,但class_exists…

    2025年12月11日
    000
  • Git中误推大型文件夹怎么办?如何安全删除远程仓库的大型文件夹?

    紧急处理:Git远程仓库大型文件夹误推解决方案 误将大型文件夹推送到Git远程仓库,导致克隆和拉取速度极慢?本文提供安全有效的解决方案,避免影响团队协作。 问题场景: 假设运维人员误将一个1GB的“image”文件夹推送到生产环境的master分支,严重影响其他开发者工作效率。 解决方案: 直接删除…

    2025年12月11日
    000
  • Git提交大文件或文件夹如何避免影响团队协作?

    高效处理 Git 中的大型文件和文件夹 在团队协作开发中,提交大型文件或文件夹到 Git 仓库可能会导致克隆和拉取速度缓慢,影响团队效率。 本文提供一种方法,在移除大文件的同时,避免影响其他成员的工作和生产环境。 解决方案: 为了防止误删导致生产环境问题,建议采取以下步骤: 本地删除大文件: 使用以…

    2025年12月11日
    000
  • 如何用正则表达式高效替换大量标签和值?

    利用正则表达式实现精准批量替换 面对海量标签及对应值的替换任务,简单的preg_replace函数已显得力不从心,因为它无法针对不同标签匹配不同的替换值。本文将介绍一种更高效、更灵活的方案:使用preg_replace_callback函数。 解决方案: preg_replace_callback函…

    2025年12月11日
    000
  • Docker LNMP环境下WordPress访问PHP报File not found如何解决?

    Docker LNMP环境下WordPress访问PHP提示“文件未找到”的解决方法 在使用Docker搭建LNMP(Linux、Nginx、MySQL、PHP)环境并运行WordPress时,如果访问PHP文件出现“文件未找到”(File not found)错误,而HTML文件可以正常访问,则问…

    2025年12月11日
    000
  • Docker Compose部署LEMP环境报错“Primary script unknown”是什么原因?

    Docker Compose 部署 LEMP 环境报错“Primary script unknown”解决方案 在使用 docker compose 部署 lemp (linux, nginx, mysql, php) 环境时,访问 php 文件出现 “primary script unknown”…

    2025年12月11日
    000
  • PDO本地prepare语句报错ONLY_FULL_GROUP_BY:如何解决?

    PDO本地prepare语句与SQL模式冲突 启用PDO本地prepare功能(pdo::attr_emulate_prepares = false)后,在MySQL 8的ONLY_FULL_GROUP_BY模式下执行包含GROUP BY的语句时,可能会出现错误。 这是因为ONLY_FULL_GRO…

    2025年12月11日
    000
  • 快速链接管理器

    fastlinkmanager:高效管理短链接和重定向的利器 FastLinkManager是一个简洁易用的脚本,用于管理短链接及重定向,支持英语和波斯语两种语言。 它提供三种便捷的短链接创建方式: 自动生成: 脚本自动为每个链接生成唯一的短ID。自定义短链接: 您可以手动设置您想要的短链接。域名替…

    2025年12月11日
    000
  • 一对具有相等数字总和的最高总和

    > 2342。具有等分总和 总和的最高总和 难度:中等 >>主题:数组,哈希表,排序,堆(优先级队列) >您得到了由正面整数组成的0个索引数字。您可以选择两个索引i和j,以便i!= j,数字数字的数字之和等于nums [j]。。 返回 nums [i] nums [j]的最大…

    好文分享 2025年12月11日
    000
  • 与同一产品的元组

    1726。与同一产品的元组 难度:中等 >主题:数组,哈希表,计数 给定一个不同的阵列,正整数,返回。> >示例1: >输入: nums = [2,3,4,6]>输出: 8 >说明:有8个有效的元组: (2,6,3,4) , (2,6,4,3) , (6,2,3,…

    好文分享 2025年12月11日
    000
  • Windows RDP托管:远程开发工作区的完整指南

    作为当今数字时代的开发人员,拥有一个可靠且强大的远程工作空间不仅是一种奢侈品,而且是必不可少的。 Windows远程桌面协议(RDP)托管在开发人员中越来越受欢迎,这是有充分理由的。在本指南中,我将分享我在Windows RDP托管方面的经验,以及为什么它可能是您想要的解决方案。 **为什么每个开发…

    好文分享 2025年12月11日
    000
  • 与作曲家制作和共享PHP库

    Composer已成为PHP项目依赖管理和代码复用的核心工具。无论您是贡献开源项目还是提升个人开发效率,学习创建Composer包都是一项非常有价值的技能。本文将引导您完成构建和共享个人PHP库的完整流程。 准备工作 在开始之前,请确保您已具备以下条件: 扎实的PHP和Composer基础知识。已在…

    2025年12月11日
    000
  • 清除数字

    算法题:清除数字 (难度:简单) 题目描述:给定一个字符串 s,其中包含小写英文字母和数字。你需要重复执行以下操作,直到字符串中不再包含数字:找到第一个数字,并删除该数字以及它左侧最近的非数字字符。最终返回删除所有数字后的字符串。 示例: 输入: s = “abc” 输出: …

    2025年12月11日
    000
  • 通过Laravel和Livewire邀请开发ERP

    大家好, 我最近完成了一个基于Web的计费系统项目,使用Laravel和Livewire框架构建。最初,这个项目只是为了满足朋友的需求,帮他创建一个简单的客户交易记录系统。 我通过在数据库中存储产品信息,然后将这些产品添加到发票中来实现发票/账单的创建功能。 随着项目的进展,我逐步添加了更多功能,例…

    2025年12月11日
    000
  • WebFormSPHP更新到WebFARSJS

    php webforms核心技术详解:服务器端与客户端的无缝交互 WebForms核心技术实现了服务器端PHP类与客户端WebFormsJS库的无缝通信。 最新的PHP WebForms类已完全兼容最新版本的WebFormsJS库,并充分利用了1.6版本的所有新功能。 该技术支持所有HTML事件(例…

    2025年12月11日 好文分享
    000
  • 特殊阵列i

    3151。特殊阵列i 难度:> easy 主题: array special如果其每对相邻元素都包含两个具有不同奇偶校验的数字。>您有一个整数数字。如果nums为a special 数组,返回true,否则,返回false。>>示例1: >输入: nums = [1]&…

    好文分享 2025年12月11日
    000
  • 检查数组是否被分类并旋转

    题目:1752. 检查数组是否已排序并旋转 难度:中等 主题:数组 给定一个数组 nums,如果该数组最初按非递减顺序排序,然后旋转了任意数量的位置(包括零),则返回 true;否则,返回 false。 原始数组中可能包含重复元素。 注意:一个数组 a 旋转 x 个位置后得到一个相同长度的数组 b,…

    2025年12月11日
    000
  • 网格中的最大鱼数

    2658。网格中的鱼数 中的最大数量 难度:中等 >主题:数组,深度优先搜索,广度优先搜索,联合查找,矩阵 >您得到了0-索引2d矩阵网格的大小m x n,其中(r,c)表示: 如果网格[r] [c] = 0或a水含有网格[r] [c]鱼的细胞,如果网格[r] [c] > 0. 渔…

    2025年12月11日
    000

发表回复

登录后才能评论
关注微信