Fork() 和 execv() 不是 运行 并行,为什么?
Fork() and execv() not running in parallel, why?
我正在尝试 运行 通过 execv() 执行一系列命令,并在 C 中为每个 运行 分叉一个新进程,但由于某些原因它们不是 运行并联。以下代码是每个进程的 运行,“full”是文件路径,“args”是参数。我知道 execv() 部分不是问题,它与我分叉和等待的方式有关。
int status;
pid_t pid = fork();
if (pid == 0) {
execv(full, args);
//perror("execv");
} else if (pid < 0) {
printf("%s\n", "Failed to fork");
status = -1;
} else {
if (waitpid(pid, &status, 0) != pid) {
status = -1;
return status;
}
}
当 运行 执行此代码时,分支命令只是 运行 一个接一个地执行。我不知道这怎么会发生。
如果不想等待每个child进程,不要立即调用waitpid
;正如所写,你 fork
一个 child,然后 立即 停止 parent 中的所有处理,直到 child 进程退出,阻止你不再分叉 children。如果你想启动多个 children 而不留下僵尸进程(并且可能在某个时候监视它们以确定它们的退出状态),你可以执行以下操作之一:
- 将每个
fork
的 pid
存储在一个数组中,并在启动所有需要启动的进程后对它们一一调用 waitpid
- 存储成功启动的 child 个进程的计数并调用
wait
多次以等待它们以它们完成的任何顺序。
- Ignore the
SIGCHLD
from the child processes entirely,因为当你不关心他们什么时候退出,不需要知道他们的状态等等
我正在尝试 运行 通过 execv() 执行一系列命令,并在 C 中为每个 运行 分叉一个新进程,但由于某些原因它们不是 运行并联。以下代码是每个进程的 运行,“full”是文件路径,“args”是参数。我知道 execv() 部分不是问题,它与我分叉和等待的方式有关。
int status;
pid_t pid = fork();
if (pid == 0) {
execv(full, args);
//perror("execv");
} else if (pid < 0) {
printf("%s\n", "Failed to fork");
status = -1;
} else {
if (waitpid(pid, &status, 0) != pid) {
status = -1;
return status;
}
}
当 运行 执行此代码时,分支命令只是 运行 一个接一个地执行。我不知道这怎么会发生。
如果不想等待每个child进程,不要立即调用waitpid
;正如所写,你 fork
一个 child,然后 立即 停止 parent 中的所有处理,直到 child 进程退出,阻止你不再分叉 children。如果你想启动多个 children 而不留下僵尸进程(并且可能在某个时候监视它们以确定它们的退出状态),你可以执行以下操作之一:
- 将每个
fork
的pid
存储在一个数组中,并在启动所有需要启动的进程后对它们一一调用waitpid
- 存储成功启动的 child 个进程的计数并调用
wait
多次以等待它们以它们完成的任何顺序。 - Ignore the
SIGCHLD
from the child processes entirely,因为当你不关心他们什么时候退出,不需要知道他们的状态等等