多次调用uv_run是正常的吗?

时间:2016-10-19 12:02:50

标签: 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");
    }
}

1 个答案:

答案 0 :(得分:1)

抛开您的示例,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行代码片段来说很难说。