CNode

在用libuv 在读取文件内容时采用 uv_fs_read , 但一直不明白怎么用。看代码。

问答
Mmrlong发布于10 年前最后回复10 年前11 回复6712 浏览0 收藏
// 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)

N
ncuzp#1·10 年前

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

M
mrlong#2·10 年前
引用 ncuzp读文件内容的回调会被调用多次直到读取完毕

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

M
mrlong#3·10 年前

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

M
mrlong#4·10 年前

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

Y
yjhjstz#5·10 年前
M
mrlong#6·10 年前
引用 yjhjstzhttps://github.com/nikhilm/uvbook 看看这个

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

M
mrlong#7·10 年前

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

M
mrlong#8·10 年前

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

捕获.PNG

N
ncuzp#9·10 年前
引用 mrlong我在网上了别人的例子,发现是这样用的。但是我自己写还没有定buf

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

N
ncuzp#11·10 年前
引用 mrlong@ncuzp 全局会不会影响访问冲突??

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

参与回复
登录后即可参与回复。登录