文件系统
简略的文件系统读写操作应用 uv_fs* 函数和 uv_fs_t 构造体实现。
留神:libuv 文件系统操作不同于套接字操作。套接字操作应用操作系统提供的非阻塞操作。文件系统操作在外部应用阻塞函数,然而在线程池中调用这些函数,并在须要应用程序交互时告诉注册到事件循环中的监督者。
所有文件系统函数都有两种模式——同步和异步。
如果回调为空,同步表单会主动被调用 (并阻塞)。函数的返回值是一个 libuv 错误代码。这通常只对同步调用有用。当传递回调且返回值为 0 时,将调用异步表单。
读 / 写文件
关上文件描述符能够用
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 – 关上一个文件
void on_open(uv_fs_t *req) {
// The request passed to the callback is the same as the one the call setup
// function was passed.
assert(req == &open_req);
if (req->result >= 0) {iov = uv_buf_init(buffer, sizeof(buffer));
uv_fs_read(uv_default_loop(), &read_req, req->result,
&iov, 1, -1, on_read);
}
else {fprintf(stderr, "error opening file: %s\n", uv_strerror((int)req->result));
}
}
uv_fs_t 的 result 字段是 uv_fs_open 回调时的文件描述符。如果文件胜利关上,咱们就开始读文件。
uvcat/main.c – 读回调
void on_read(uv_fs_t *req) {if (req->result < 0) {fprintf(stderr, "Read error: %s\n", uv_strerror(req->result));
}
else if (req->result == 0) {
uv_fs_t close_req;
// synchronous
uv_fs_close(uv_default_loop(), &close_req, open_req.result, NULL);
}
else if (req->result > 0) {
iov.len = req->result;
uv_fs_write(uv_default_loop(), &write_req, 1, &iov, 1, -1, on_write);
}
}