我想在C中创建一个程序,在其中我使用fork()创建多个子代,然后等待所有子代完成并执行父代代码(仅一次)。 我尝试使用for循环和两个fork,但存在一个问题:父代码未最后运行,或者子代未并行运行。
//Number of processes I want to create
int processes = 6;
pid_t *main_fork = fork();
if(main_fork ==0){
for(int i=0;i<processes;i++){
pid_t *child_fork = fork();
if(child_fork ==0){
// child code
exit(0);
}
else if(child_fork >0){
//And here is the problem, with the wait: children don't
//run parallel and if I delete it, the main parent code doesn't run
wait(NULL);
}else{
// Child fork failed
printf("fork() failed!\n");
return 1;
}
}
}else if(main_fork >0){
wait(NULL);
//Main parent code - here I want to do something only once after all
//children are done
}else{
// Main fork failed
printf("fork() failed!\n");
return 1;
}
如果有人可以修复我的代码,或者为这个问题写一个更好的解决方案,我将非常感激!
答案 0 :(得分:0)
如果希望所有子代并行运行,则必须在所有子代启动后进行等待。否则,您将启动一个孩子,等待它完成,开始一个新孩子,等待该孩子完成,开始第三个孩子,等待第三个孩子完成,依此类推...
因此,您通常要做的是启动所有子级并将所有pid_t
放入数组中,完成后,您可以为每个wait()
调用pid_t
< / p>
这是针对您的情况的简单且足够好的解决方案。
以下是适合您问题的示例代码:
pid_t children[processes];
for(int i=0; i<processes; i++)
{
pid_t child = fork();
if(child == 0)
{
// child code
....
// We call _exit() rather than exit() since we don't want to clean up
// data structures inherited from parent
_exit(0);
}
else if (child == -1)
{
// Child fork failed
fprintf(stderr, "myprog: fork failed, %s", strerror(errno));
// Do real cleanup on failure is to complicated for this example, so we
// just exit
exit(EXIT_FAILURE);
}
children[i] = child;
}
// Do something if you want to do something before you expect the children to exit
....
for(int i=0; i<processes; i++)
{
pid_t child = children[i];
int status;
waitpid(child, &status, );
// Do something with status
}
自然地,这不是一个适合任何情况的完整示例。有时,您必须告诉孩子们什么时候应该离开。有时候,孩子不能一口气启动/停止,而您必须玩异步事件,依此类推...