文件系统
简略的文件系统读写操作应用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); }}