如何分叉并创建特定数量的 children 来执行相同的任务?
How to fork and create a specific number of children that perform the same task?
我需要编写一个调用 fork() 给定次数的 C 程序。每个 child 进程需要执行相同的任务(添加一些随机数直到达到给定的总和)。 parent 进程一直等到所有 child 进程都退出。我已经编写了以下代码,但我的输出显示另一个 child 在第一个代码完成之前不会开始执行它的代码。
for (i = 0; i < num_forks; i++) {
child_pid = fork();
if (child_pid < 0) {
perror("fork\n");
} else if (child_pid == 0) {
childProcess(i, goal);
} else {
parentProcess();
}
}
编辑: objective 是让所有 child 进程同时 运行。 parent 等待任何 child 进程退出。只要任何一个 child 进程退出,parent 进程就会打印退出的 child 的 pid。剩余的 child 个进程继续 运行 simulatenously 直到另一个 child 退出等等。如果我在循环外调用 parentProcess(),parent 只会在最后一个 child 进程退出时打印退出的 child pid。
您需要将调用移至 parentProcess()
循环外:
for (i = 0; i < num_forks; i++) {
child_pid = fork();
if (child_pid < 0) {
perror("fork\n");
} else if (child_pid == 0) {
childProcess(i, goal);
}
}
parentProcess();
否则,parent 依次等待每个 child,然后再 运行 下一个。
您应该在 parentProcess()
内的循环中使用 wait()
或 waitpid()
来收集所有死去的 children — 您最好提供num_forks
作为 parentProcess()
的参数。或者你需要重新定义你想做什么。这个问题表明你想要 children 运行 同时,而 parent 等待他们全部死去。这意味着你必须在等待它们之前启动所有 children——前提是不会 运行 超出进程(所以 num_forks
是一个像 20 这样的正常数字,而不是像 2,000 这样的疯狂数字或 2,000,000)。
因此,您在 parentProcess()
中的代码应该大致如下,作为基本的最低限度:
void parentProcess(void)
{
int status;
int corpse;
while ((corpse = wait(&status)) != -1)
printf("%5d: 0x%.4X\n", corpse, status);
}
这应该在循环外调用。如果在循环内调用,parent 将启动一个 child,等待它完成,然后重复该过程。我假设 childProcess()
函数永远不会 returns;如果这样做会导致混乱 return.
我需要编写一个调用 fork() 给定次数的 C 程序。每个 child 进程需要执行相同的任务(添加一些随机数直到达到给定的总和)。 parent 进程一直等到所有 child 进程都退出。我已经编写了以下代码,但我的输出显示另一个 child 在第一个代码完成之前不会开始执行它的代码。
for (i = 0; i < num_forks; i++) {
child_pid = fork();
if (child_pid < 0) {
perror("fork\n");
} else if (child_pid == 0) {
childProcess(i, goal);
} else {
parentProcess();
}
}
编辑: objective 是让所有 child 进程同时 运行。 parent 等待任何 child 进程退出。只要任何一个 child 进程退出,parent 进程就会打印退出的 child 的 pid。剩余的 child 个进程继续 运行 simulatenously 直到另一个 child 退出等等。如果我在循环外调用 parentProcess(),parent 只会在最后一个 child 进程退出时打印退出的 child pid。
您需要将调用移至 parentProcess()
循环外:
for (i = 0; i < num_forks; i++) {
child_pid = fork();
if (child_pid < 0) {
perror("fork\n");
} else if (child_pid == 0) {
childProcess(i, goal);
}
}
parentProcess();
否则,parent 依次等待每个 child,然后再 运行 下一个。
您应该在 parentProcess()
内的循环中使用 wait()
或 waitpid()
来收集所有死去的 children — 您最好提供num_forks
作为 parentProcess()
的参数。或者你需要重新定义你想做什么。这个问题表明你想要 children 运行 同时,而 parent 等待他们全部死去。这意味着你必须在等待它们之前启动所有 children——前提是不会 运行 超出进程(所以 num_forks
是一个像 20 这样的正常数字,而不是像 2,000 这样的疯狂数字或 2,000,000)。
因此,您在 parentProcess()
中的代码应该大致如下,作为基本的最低限度:
void parentProcess(void)
{
int status;
int corpse;
while ((corpse = wait(&status)) != -1)
printf("%5d: 0x%.4X\n", corpse, status);
}
这应该在循环外调用。如果在循环内调用,parent 将启动一个 child,等待它完成,然后重复该过程。我假设 childProcess()
函数永远不会 returns;如果这样做会导致混乱 return.