c - 多次调用uv_run是否正常?

标签 c asynchronous filesystems libuv

我是 uvlib 的新手。如果想避免内部函数阻塞,两次调用 uv_run 是否正常?如果没有,那么除了线程之外还有哪些工具可用?在这里我只是打开和关闭文件。

#include <uv.h>
#include <stdio.h>
#include <fcntl.h>
#include <conio.h>
#ifdef _WIN32
    #include <conio.h>
    #include <Windows.h>
    #define Sleep(x) Sleep(x)
#else
    #include <unistd.h>
    #define Sleep(x) sleep(x)
#endif

uv_loop_t* loop;

uv_fs_t open_req;
uv_fs_t close_req;

void open_cb(uv_fs_t*);
void close_cb(uv_fs_t*);

const char *filename = "C:/c/somedata.txt";

int main(int argc, char **argv) {
    int r;

    loop = uv_loop_new();

    r = uv_fs_open(loop, &open_req, filename, O_RDONLY, S_IREAD, open_cb);
    if (r < 0) {
        printf("Error at opening file: %s\n", uv_strerror(r));
    }
    printf("in main now\n");
    uv_run(loop, UV_RUN_DEFAULT);
    uv_loop_close(loop);
    return 0;
}

void open_cb(uv_fs_t* req) {
    int result = req->result;

    if (result < 0) {
        printf("Error at opening file: %s\n", uv_strerror(result));
    } else {
        printf("Successfully opened file.\n");
    }
    uv_fs_req_cleanup(req);
    uv_fs_close(loop, &close_req, result, close_cb);
    uv_run(loop, UV_RUN_DEFAULT);
    Sleep(5000);
    printf("ok now\n");
}

void close_cb(uv_fs_t* req) {
    int result = req->result;
    printf("in close_cb now\n");

    if (result < 0) {
        printf("Error at closing file: %s\n", uv_strerror(result));
    } else {
        printf("Successfully closed file.\n");
    }
}

最佳答案

抛开您的示例,libuv 提供了多次运行循环的机会。
查看documentation了解更多详情。

特别是,uv_run 函数接受类型为 uv_run_mode 的参数。
可能的值是:

  • UV_RUN_DEFAULT:它不会停止,除非您明确停止它并且直到循环中至少存在一个引用或事件资源。

  • UV_RUN_ONCE:轮询一次 I/O 并执行所有准备好提供服务的函数。它的缺点是如果没有挂起的回调,它就会阻塞。

  • UV_RUN_NOWAIT:这可能是您正在寻找的那个,与上一个类似,但如果没有挂起的回调,它不会阻塞。

    <

请注意,对于 UV_RUN_ONCEUV_RUN_NOWAIT,您必须多次运行循环。
返回值通常表示是否有其他一些挂起的回调。在这种情况下,循环迟早要运行。

最后一种模式,UV_RUN_NOWAIT,可能就是您正在寻找的模式。
例如,它可以用于客户端有自己的循环并且不能阻塞 libuv 循环的场景。


循环不止一次正常吗?
嗯,是的,但它是否正确主要取决于你的实际问题。
很难从 SO 上的 100 行代码片段中得出结论。

关于c - 多次调用uv_run是否正常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40130897/

相关文章:

asynchronous - 如何异步浏览目录及其子目录?

java - 为什么我可以在 Linux 中成功移动正在写入的文件?

c - 在shell中运行C程序时将相对路径扩展为完整路径

c - 防止编译器优化静态结构变量

c++ - 如何制作在线C/C++编译器?

C - 基本 I/O 读取只读 "\n"

javascript - RxJS Observable 立即返回数据,为什么?

c++ - C++ 中安全异步回调的模式

javascript - 如何将 svg Canvas 保存到本地文件系统

asynchronous - 如何确保所有数据都从 clojure core.async channel 写入文件?