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。
最近一直在玩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。