libuv:fork 和 uv_spawn 之间的区别?

libuv: difference between fork and uv_spawn?

最近一直在玩Libuv。就子进程而言,我不了解编程模型。 例如看下面的代码:

uv_loop_t *loop;
uv_process_t child_req;
uv_process_options_t options;

void on_exit(uv_process_t* proc, long int io, int hj)
{
        std::cout<<"on exit call back"<<std::endl;
}

int main() 
{
    loop = uv_default_loop();

    char* args[3];
    args[0] = "mkdir";
    args[1] = "test-dir";
    args[2] = NULL;

    options.exit_cb = on_exit;
    options.file = "mkdir";
    options.args = args;

    int r;
    r = uv_spawn(loop, &child_req, &options);
    std::cout<<r<<std::endl;
    if (r) {
            std::cout<<"from line 231"<<std::endl;
        fprintf(stderr, "%s\n", uv_strerror(r));
        return 1;
    } else {
        fprintf(stderr, "Launched process with ID %d\n", child_req.pid);
    }

    return uv_run(loop, UV_RUN_DEFAULT);
}

此处打印在控制台上的输出是:

0
Launched process with ID 511168
on exit call back

在我看来 uv_spawn 的行为类似于 fork()。在子进程中,r 的值是 0,在父进程中,它是非零的。所以 from line 231 也应该打印出来。但显然不是。我从头到尾阅读了 documentation,但我没有头绪。 任何帮助将不胜感激。

n my understanding uv_spawn acts like fork()

然后像 execve 和 child 变成 mkdir。所以 child 执行 mkdir,并且只对你的代码执行 parent returns。