在用libuv 在读取文件内容时采用 uv_fs_read , 但一直不明白怎么用。看代码。
发布于 8 年前 作者 mrlong 5721 次浏览 来自 问答
// BIO mode
void main()
{
    fd = open(path, ...);
    while (read(fd, ...) != 0) {
        write(STDOUT_FILENO, ...);
    }
    close(fd);
}
// libuv AIO mode
void main()
{
    fd = uv_fs_open(&open_req, path, ..., open_cb);
    uv_run(...);
}

void open_cb(uv_fs_t *req) {
    uv_fs_read(req->result, ..., read_cb);
}

void read_cb(uv_fs_t *req) {
    if (req->result > 0) {
        uv_fs_write(STDOUT_FILENO, ..., write_cb);    //这地方不能白,为什么还要write 直接取出buf,由业务处理就行了。
    } else if (req->result == 0) {
        uv_fs_close(open_req.result, NULL);
    }
}

void write_cb(uv_fs_t *req) {
    uv_fs_read(open_req.result, ..., read_cb);   //为什么还要read_cb   ????
}

例子中根本没有看到读出来的内容。我查了uv_fs_t 的定义:

struct uv_fs_s {
  UV_REQ_FIELDS
  uv_fs_type fs_type;
  uv_loop_t* loop;
  uv_fs_cb cb;
  ssize_t result;
  void* ptr;
  const char* path;
  uv_stat_t statbuf;  /* Stores the result of uv_fs_stat() and uv_fs_fstat(). */
  UV_FS_PRIVATE_FIELDS
};
11 回复

读文件内容的回调会被调用多次直到读取完毕

@ncuzp 文件的内容在哪??? 是uv_fs_read()转进的参数吗,这个是全局的,如是多次或异步会不会冲突。 你是怎么写??

捕获.PNG uv_fs_t req; req->bufs 有这个吗???

libuv 的文档实在太少了。官方只出接口定义,没有例子。

@yjhjstz 这个官方的文档一样的 http://www.libuv.org 只是汉化了。

我在网上了别人的例子,发现是这样用的。但是我自己写还没有定buf 捕获.PNG 捕获2.PNG

我现在是问题,是无法找到 read() 返回的buf ,就是读取之后的内容。

捕获.PNG

@mrlong 你这个是一个代码片段还是什么?我看到uvbook里面uvcat的代码iov是全局的

@ncuzp 全局会不会影响访问冲突??

@mrlong 这个要看怎么用吧,uvcat的例子每次on_open都重新初始化了iov,相当于重复利用了内存,使用者应该清楚自己是怎么使用的会不会造成内存被覆写,泄漏等问题

回到顶部