libuv 是一个专注于异步 I/O 的多平台支持库。它主要是为Node.js使用而开发的,但它也被Luvit、Julia、 uvloop和其他人使用。
由 epoll、kqueue、IOCP、事件端口支持的全功能事件循环。
异步 TCP 和 UDP 套接字
异步 DNS 解析
异步文件和文件系统操作
文件系统事件
ANSI 转义码控制 TTY
带套接字共享的 IPC,使用 Unix 域套接字或命名管道 (Windows)
子进程
线程池
信号处理
高分辨率时钟
线程和同步原语
[hidecontent type="logged" desc="隐藏内容:登录后可查看"]
从 1.0.0 版开始,libuv 遵循语义版本控制 方案。API 更改和向后兼容规则由 SemVer 指示。libuv 将在主要版本中保持稳定的 ABI。
可以在此处跟踪 ABI/API 更改。
libuv 在 MIT 许可证下获得许可。检查LICENSE和 LICENSE-extra文件。
该文档根据 CC BY 4.0 许可获得许可。检查 LICENSE-docs 文件。
位于 docs/ 子目录中。它使用Sphinx 框架,这使得构建多种格式的文档成为可能。
显示不同的支持构建选项:
$ make help
将文档构建为 HTML:
$ make html
将文档构建为 HTML 并在更改时实时重新加载它(这需要安装 sphinx-autobuild 并且仅在 Unix 上受支持):
$ make livehtml
将文档构建为手册页:
$ make man
将文档构建为 ePub:
$ make epub
注意:Windows 用户需要使用 make.bat 而不是普通的“make”。
可以在此处在线浏览文档。
测试和基准测试 也作为 API 规范和使用示例。
这些资源不由 libuv 维护者处理,可能已过时。请在打开新问题之前验证它。
libuv 可以从 GitHub 存储库 或下载站点下载。
在验证 git 标签或签名文件之前,需要导入相关密钥。密钥 ID 列在 MAINTAINERS 文件中,但也可用作 git blob 对象以便于使用。
以通常的方式导入密钥:
$ gpg --keyserver pool.sks-keyservers.net --recv-keys AE9BC059
从 git blob 对象导入密钥:
$ git show pubkey-saghul | gpg --import
Git 标签是用开发者密钥签名的,可以通过如下方式验证:
$ git verify-tag v1.6.1
从 libuv 1.7.0 开始,下载站点中存储的 tarball 都经过签名,每个文件旁边都有一个随附的签名文件。下载发布 tarball 和签名文件后,可以按如下方式验证文件:
$ gpg --verify libuv-1.7.0.tar.gz.sign
对于类 UNIX 平台,包括 macOS,有两种构建方法:autotools 或CMake。
对于 Windows,CMake是唯一受支持的构建方法,并且具有以下先决条件:
PATH
使用自动工具构建:
$ sh autogen.sh
$ ./configure
$ make
$ make check
$ make install
使用CMake构建:
$ mkdir -p build
$ (cd build && cmake .. -DBUILD_TESTING=ON) # generate project with tests
$ cmake --build build # add `-j <n>` with cmake >= 3.12
# Run tests:
$ (cd build && ctest -C Debug --output-on-failure)
# Or manually run tests:
$ build/uv_run_tests # shared library build
$ build/uv_run_tests_a # static library build
要与CMake交叉编译(不受支持但通常有效):
$ cmake ../.. \
-DCMAKE_SYSTEM_NAME=Windows \
-DCMAKE_SYSTEM_VERSION=6.1 \
-DCMAKE_C_COMPILER=i686-w64-mingw32-gcc
$ brew install --HEAD libuv
OS X 用户注意事项:
确保您在“ARCHS”标志中指定了您希望构建的体系结构。您可以通过用空格分隔来指定多个(例如“x86_64 i386”)。
$ git clone https://github.com/microsoft/vcpkg.git
$ ./bootstrap-vcpkg.bat # for powershell
$ ./bootstrap-vcpkg.sh # for bash
$ ./vcpkg install libuv
一些测试对时间敏感。在缓慢或超载的机器上可能需要放宽测试超时:
$ env UV_TEST_TIMEOUT_MULTIPLIER=2 build/uv_run_tests # 10s instead of 5s
所有测试的列表在test/test-list.h
.
此调用将导致测试驱动程序分叉并TEST_NAME
在子进程中执行:
$ build/uv_run_tests_a TEST_NAME
此调用将导致测试驱动程序在同一进程中执行测试:
$ build/uv_run_tests_a TEST_NAME TEST_NAME
从测试驱动程序进程 ( ) 中运行测试时build/uv_run_tests_a TEST_NAME TEST_NAME
,gdb 和 valgrind 等工具可以正常工作。
当从测试驱动程序进程 ( ) 的子进程运行测试时build/uv_run_tests_a TEST_NAME
,以 fork-aware 方式使用这些工具。
使用follow-fork-mode设置:
$ gdb --args build/uv_run_tests_a TEST_NAME
(gdb) set follow-fork-mode child
...
使用--trace-children=yes
参数:
$ valgrind --trace-children=yes -v --tool=memcheck --leak-check=full --track-origins=yes --leak-resolution=high --show-reachable=yes --log-file=memcheck-%p.log build/uv_run_tests_a TEST_NAME
请参阅有关运行测试的部分。基准驱动程序是./uv_run_benchmarks_a
,基准列在test/benchmark-list.h
.
-fno-strict-aliasing
建议-fno-strict-aliasing
在使用 libuv 的项目中打开编译器标志。在存在依赖于严格别名的编译器优化的情况下,在 libuv API 中使用临时“继承”可能不安全。
MSVC 没有等效标志,但在撰写本文时(2019 年 12 月)似乎也不需要它。
使用 IBM XL C/C++ 的 AIX 编译需要版本 12.1 或更高版本。
bos.ahafs
AIX 对文件系统事件的支持需要安装非默认的 IBM包。该软件包提供了由autoconf
. IBM 文档 更详细地描述了该包。
z/OS 编译需要安装ZOSLIB 。使用CMake构建时,使用标志指定ZOSLIB-DZOSLIB_DIR
的路径:
$ (cd build && cmake .. -DBUILD_TESTING=ON -DZOSLIB_DIR=/path/to/zoslib)
$ cmake --build build
z/OS 创建 System V 信号量和消息队列。除非事件循环关闭,否则这些在进程终止后会持续存在于系统中。
使用ipcrm
命令手动清理 System V 资源。
请参阅贡献指南。
[/hidecontent]