我需要编写一个C程序,在给定的次数内调用fork()。每个子进程都需要执行相同的任务(添加一些随机数,直到达到给定的和)。父进程等待直到所有子进程退出。我已经编写了下面的代码,但是我的输出显示,在第一个代码完成之前,另一个孩子不会开始执行它的代码。
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。剩下的子进程继续模拟运行,直到另一个孩子退出,等等。如果在循环外调用父进程(),父进程只打印上次子进程退出时退出的子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();
否则,父进程将依次等待每个子进程,然后运行下一个子进程。
您应该在
wait()
中使用waitpid()
或parentProcess()
循环来收集所有死去的孩子,并且您最好提供num_forks
作为parentProcess()
的参数。或者你需要重新定义你想做什么。这个问题表明,你希望孩子们同时奔跑,而父母则等待他们全部死去。这意味着您必须在等待它们之前启动所有的子进程-除非进程没有用完(所以num_forks
是一个像20这样的正常数字,而不是像2000或2000000这样的疯狂数字)。因此,您在
parentProcess()
中的代码应该大致如下,作为基本的最低要求:void parentProcess(void)
{
int status;
int corpse;
while ((corpse = wait(&status)) != -1)
printf("%5d: 0x%.4X\n", corpse, status);
}
这应该在循环之外调用。如果在循环内调用,父级将启动一个子级,等待它完成,然后重复该过程。我假设
childProcess()
函数永远不会返回;如果它返回,将导致混乱。关于c - 如何派生并创建特定数量的执行相同任务的子代?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28803339/