我需要编写一个调用fork()给定次数的C程序。每个子进程都需要执行相同的任务(添加一些随机数,直到达到给定的总和)。父进程等待,直到所有子进程都退出。我编写了以下代码,但我的输出显示另一个孩子在完成第一个代码之前不会开始执行代码。
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();
}
}
编辑:目标是让所有子进程同时运行。父级等待任何子进程退出。只要任何一个子进程退出,父进程就会打印退出的子进程的pid。其余的子进程继续同时运行,直到另一个孩子退出,等等。如果我在循环之外调用parentProcess(),则父节点仅在最后一个子进程退出时打印出现的子pid。
答案 0 :(得分:3)
您需要将呼叫移至循环外的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();
否则,父母会在运行下一个孩子之前轮流等待每个孩子。
您应该在wait()
内的循环中使用waitpid()
或parentProcess()
来收集所有孩子,因为他们已经死亡了 - 您最好提供num_forks
作为parentProcess()
的论点。或者你需要重新定义你想要做的事情。问题表明你希望孩子们同时跑步,而父母则等待他们全部死亡。这意味着你必须在等待它们之前启动所有孩子 - 不要耗尽流程(因此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);
}
这应该在循环之外调用。如果在循环内部调用,则父级将启动一个子级,等待它完成,然后重复该过程。我假设childProcess()
函数永远不会返回;如果它确实回来会导致混乱。