在用libuv 在读取文件内容时采用 uv_fs_read , 但一直不明白怎么用。看代码。
// 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()转进的参数吗,这个是全局的,如是多次或异步会不会冲突。 你是怎么写??
uv_fs_t req; req->bufs 有这个吗???
libuv 的文档实在太少了。官方只出接口定义,没有例子。
@yjhjstz 这个官方的文档一样的 http://www.libuv.org 只是汉化了。
我在网上了别人的例子,发现是这样用的。但是我自己写还没有定buf
我现在是问题,是无法找到 read() 返回的buf ,就是读取之后的内容。
@mrlong 你这个是一个代码片段还是什么?我看到uvbook里面uvcat的代码iov是全局的
@ncuzp 全局会不会影响访问冲突??
@mrlong 这个要看怎么用吧,uvcat的例子每次on_open都重新初始化了iov,相当于重复利用了内存,使用者应该清楚自己是怎么使用的会不会造成内存被覆写,泄漏等问题