没有合适的资源?快使用搜索试试~ 我知道了~
首页libuv中文入门教程:高性能事件驱动库详解
libuv中文入门教程:高性能事件驱动库详解
需积分: 24 52 下载量 180 浏览量
更新于2024-07-20
收藏 1.01MB PDF 举报
"libuv中文学习指南"是一本专门针对libuv高性能事件I/O库的入门教程,由Nikhil Marathe翻译,MingShun完成于2013年9月10日。libuv是一个跨平台的库,为Windows和Unix系统提供了一致的API,旨在简化开发者在不同操作系统上的事件驱动编程工作。本书主要关注libuv的核心功能,并非详尽列出所有函数和数据结构,而是作为参考手册的一个补充。 书中适合两类读者:一是系统程序员,特别是那些想要开发底层程序如守护进程、网络服务和客户端,libuv的事件循环模型能很好地适应他们的应用需求;二是node.js模块的开发者,他们希望通过C或C++封装平台API,并将其异步接口提供给JavaScript环境。然而,这部分开发者还需要额外了解与v8和node.js相关的知识,因为书中并未涵盖所有相关背景。 libuv的起源可以追溯到2009年的node.js项目,当时为了支持Windows,开发团队决定采用能够跨越Unix和Windows平台的解决方案,于是有了libuv。它最初是作为libev的替代品引入node.js的,但在0.9.0版本之后,libev被移除,libuv逐渐发展成为一个独立且高质量的系统程序库,不仅仅局限于node.js项目,也得到了Mozilla的Rust语言和其他语言绑定的支持。 libuv的第一个独立版本是0.10.3,这意味着随着时间的推移,libuv的功能和影响力不断扩大,成为现代软件开发中不可或缺的一部分,特别是在处理高并发和实时性要求的应用场景中。对于想要深入学习和使用libuv的开发者来说,这本书提供了一个很好的起点,帮助他们理解和掌握这个强大工具的精髓。
资源详情
资源推荐
![](https://csdnimg.cn/release/download_crawler_static/9642358/bgb.jpg)
CHAPTER 3
文文文件件件系系系统统统
文件系统的简单读/写操作可使用 uv_fs_
*
函数和 uv_fs_t 结构体来完成。
注注注解解解: libuv 的文件系统操作与 套接字操作 不同。套接字操作使用操作系统提供的非阻塞操作。文件系统在
内部使用阻塞函数, 但会在线程池中调用这些函数并在应用程序需要与之交互时通知已被注册到事 件循环
的监视器。
所有的文件系统操作函数都有形式 - 同步 和 异步 。
如果不指定回调函数, 同步 函数会自动被调用(并 阻阻阻塞塞塞)。 函数的返回值相当于 Unix 返回值(通常是成
功返回 0,出错返回 -1)。
在回调函数传入后, 异步 函数会被调用,并返回 0。
3.1 读读读/写写写文文文件件件
文件描述符使用下列函数获取
int uv_fs_open(uv_loop_t
*
loop, uv_fs_t
*
req, const char
*
path, int flags, int mode, uv_fs_cb cb)
flags 和 mode 为标准的 Unix 标志 。libuv 会负责将它们转换成相应的 Windows 标志。
文件描述符使用下列函数关闭
int uv_fs_close(uv_loop_t
*
loop, uv_fs_t
*
req, uv_file file, uv_fs_cb cb)
文件系统操作的回调函数有下列的签名:
void callback(uv_fs_t
*
req);
让我们看一个 cat 命令的简单实现。我们从给已打开的文件注册回调函数开始:
uvcat/main.c - 打打打开开开文文文件件件
1 void on_open(uv_fs_t
*
req) {
2 if (req->result != -1) {
3 uv_fs_read(uv_default_loop(), &read_req, req->result,
7
![](https://csdnimg.cn/release/download_crawler_static/9642358/bgc.jpg)
libuv 入入入门门门, 发发发布布布 1.0.0
4 buffer, sizeof(buffer), -1, on_read);
5 }
6 else {
7 fprintf(stderr, "error opening file: %d\n", req->errorno);
8 }
9 uv_fs_req_cleanup(req);
10 }
uv_fs_open 接收的回调函数的参数 uv_fs_t 中的 ‘‘result‘ 字段为文件描述符。 若成功打开文件我们就开
始读取它。
警警警告告告: 必须调用 uv_fs_req_cleanup() 函数来释放 libuv 内部分配的内存。
uvcat/main.c - 读读读取取取回回回调调调函函函数数数
1 void on_read(uv_fs_t
*
req) {
2 uv_fs_req_cleanup(req);
3 if (req->result < 0) {
4 fprintf(stderr, "Read error: %s\n", uv_strerror(uv_last_error(uv_default_loop())));
5 }
6 else if (req->result == 0) {
7 uv_fs_t close_req;
8 // synchronous
9 uv_fs_close(uv_default_loop(), &close_req, open_req.result, NULL);
10 }
11 else {
12 uv_fs_write(uv_default_loop(), &write_req, 1, buffer, req->result, -1, on_write);
13 }
14 }
在调用读取操作时 ,你应该传入一个 已初始化 的缓冲区,在触发读取回调函数前,数据将被缓存在此缓冲
区内。
对于 EOF 的情况,读取回调函数的 result 字段为 0;读取出错时, 其值为 -1;读取成功时,其值为已读
取的字节数。
这里你会看到一个编写异步程序的共同模式。uv_fs_close() 的调用是同步执行的。 通常, 一次性的或
作为启动或关闭部分被分离出来的任务会被同步地执行,因 为我们关心的是在程序执行主要任务和处理多
个 I/O 源时的快速 I/O 。对于单个任务,其性能的差异是微不足道的,且编写出来的代码可能会更简单。
我们可以把这种模式概括为,原始系统调用的真正返回值被存放在 uv_fs_t.result 之中。
文件系统的写入同样是简单地使用 uv_fs_write()。 你的回调函数将会在写入完成后被调用 。在我们的
例子中,回调函数只是简单地驱动下一轮读取操作。 所以, 回调函数让读写操作处在一个连锁的处 理过程
之内。
uvcat/main.c - 写写写入入入回回回调调调函函函数数数
1 void on_write(uv_fs_t
*
req) {
2 uv_fs_req_cleanup(req);
3 if (req->result < 0) {
4 fprintf(stderr, "Write error: %s\n", uv_strerror(uv_last_error(uv_default_loop())));
5 }
6 else {
7 uv_fs_read(uv_default_loop(), &read_req, open_req.result, buffer, sizeof(buffer), -1, on_read);
8 Chapter 3. 文文文件件件系系系统统统
![](https://csdnimg.cn/release/download_crawler_static/9642358/bgd.jpg)
libuv 入入入门门门, 发发发布布布 1.0.0
8 }
9 }
注注注解解解: 保存在 errno 中的错误信息可以通过 uv_fs_t.errorno 访问,但它已被转换为标准的 UV_
*
错误代
码。现在还没有办法可以直接从 errorno 字段获取错误消息的字符串。
警警警告告告: 由于文件系统和磁盘驱动器的运行方式是以性能优先来配置的 ,写入‘成功’的数据可能还未被提
交到磁盘。关于更强的写入保证,请见 uv_fs_fsync 。
我们在 main() 函数中让多米诺骨牌开始翻倒吧:
uvcat/main.c
1 int main(int argc, char
**
argv) {
2 uv_fs_open(uv_default_loop(), &open_req, argv[1], O_RDONLY, 0, on_open);
3 uv_run(uv_default_loop(), UV_RUN_DEFAULT);
4 return 0;
5 }
3.2 文文文件件件系系系统统统操操操作作作
所有标准的文件系统操作,像 unlink 、 rmdir 、 stat 都支持异步调用方式,并具有直观的参数顺序。
它们都遵循和读/写/打开调用相同的模式,调用结果返回到 uv_fs_t.result 字段中 。 完整的 函数列表 如
下:
文文文件件件操操操作作作
UV_EXTERN int uv_fs_close(uv_loop_t
*
loop, uv_fs_t
*
req, uv_file file,
uv_fs_cb cb);
UV_EXTERN int uv_fs_open(uv_loop_t
*
loop, uv_fs_t
*
req, const char
*
path,
int flags, int mode, uv_fs_cb cb);
UV_EXTERN int uv_fs_read(uv_loop_t
*
loop, uv_fs_t
*
req, uv_file file,
void
*
buf, size_t length, int64_t offset, uv_fs_cb cb);
UV_EXTERN int uv_fs_unlink(uv_loop_t
*
loop, uv_fs_t
*
req, const char
*
path,
uv_fs_cb cb);
UV_EXTERN int uv_fs_write(uv_loop_t
*
loop, uv_fs_t
*
req, uv_file file,
void
*
buf, size_t length, int64_t offset, uv_fs_cb cb);
UV_EXTERN int uv_fs_mkdir(uv_loop_t
*
loop, uv_fs_t
*
req, const char
*
path,
int mode, uv_fs_cb cb);
UV_EXTERN int uv_fs_rmdir(uv_loop_t
*
loop, uv_fs_t
*
req, const char
*
path,
uv_fs_cb cb);
UV_EXTERN int uv_fs_readdir(uv_loop_t
*
loop, uv_fs_t
*
req,
const char
*
path, int flags, uv_fs_cb cb);
3.2. 文文文件件件系系系统统统操操操作作作 9
剩余62页未读,继续阅读
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://profile-avatar.csdnimg.cn/default.jpg!1)
codeshawn
- 粉丝: 1
- 资源: 8
上传资源 快速赚钱
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助
![](https://csdnimg.cn/release/wenkucmsfe/public/img/voice.245cc511.png)
最新资源
- 解决本地连接丢失无法上网的问题
- BIOS报警声音解析:故障原因与解决方法
- 广义均值移动跟踪算法在视频目标跟踪中的应用研究
- C++Builder快捷键大全:高效编程的秘密武器
- 网页制作入门:常用代码详解
- TX2440A开发板网络远程监控系统移植教程:易搭建与通用解决方案
- WebLogic10虚拟内存配置详解与优化技巧
- C#网络编程深度解析:Socket基础与应用
- 掌握Struts1:Java MVC轻量级框架详解
- 20个必备CSS代码段提升Web开发效率
- CSS样式大全:字体、文本、列表样式详解
- Proteus元件库大全:从基础到高级组件
- 74HC08芯片:高速CMOS四输入与门详细资料
- C#获取当前路径的多种方法详解
- 修复MySQL乱码问题:设置字符集为GB2312
- C语言的诞生与演进:从汇编到系统编程的革命
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
![](https://img-home.csdnimg.cn/images/20220527035711.png)
![](https://img-home.csdnimg.cn/images/20220527035711.png)
![](https://img-home.csdnimg.cn/images/20220527035111.png)
安全验证
文档复制为VIP权益,开通VIP直接复制
![](https://csdnimg.cn/release/wenkucmsfe/public/img/green-success.6a4acb44.png)