libuv:fork 和 uv_spawn 的区别?

Posted

技术标签:

【中文标题】libuv:fork 和 uv_spawn 的区别?【英文标题】:libuv: difference between fork and uv_spawn? 【发布时间】:2021-12-30 00:09:01 【问题描述】:

最近我一直在玩 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(). In child process the value of r is 0 那么mkdir 发生了什么? mkdir 是子进程,而不是你的程序。孩子执行mkdir 代码,而不是你的。 谢谢@KamilCuk。它使事情变得清晰。 【参考方案1】:

n 我的理解 uv_spawn 的行为类似于 fork()

然后就像execve 和孩子变成mkdir。所以子进程执行mkdir,只有父进程返回你的代码。

【讨论】:

以上是关于libuv:fork 和 uv_spawn 的区别?的主要内容,如果未能解决你的问题,请参考以下文章

[转帖]libev与libuv的区别

libuv源码分析前言

libuv vs asyncio (python)

git clone和fork的区别

什么是libuv?

fork 和 exec 的区别