乐趣区

关于linux:译libuv之三文件系统

文件系统

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