#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
int main ()
{
int i;
printf("\n [ID = %d] I am the root parent \n", getpid());
for(i=0;i<4;i++)
{
pid_t ret=fork();
if(ret <0) //eror occured
{
printf("Fork Failed \n");
return 1;
}
else if (ret == 0){
printf("\n [ID =%d] My parent is [%d]\n", getpid(), getppid());
}
else
{
wait(NULL);
exit(0);
}
}
return 0;
}
这是我的输出
[ID = 4478] I am the root parent
[ID =4479] My parent is [4478]
[ID =4480] My parent is [4479]
[ID =4481] My parent is [4480]
[ID =4482] My parent is [4481]
当我勾勒出来时,它只是一个链式过程树。
p
|
C1
|
C2
|
C3
|
C4
我尝试了其他编写方法,但是这差不多要四个孩子。我的其他尝试获得了6分。
最佳答案
您的缺陷在于程序本身的逻辑。首先,您考虑使用4个迭代进行循环,而实际上您只希望在父进程中有2个孩子。但是,当fork
成功(ret > 0
)时,您正在调用wait(NULL); exit(0);
,这将停止for
循环并在wait
停止挂起后退出该进程。当孩子是forked
时,他们自己也会在for
循环内。如果循环没有陷入wait(NULL); exit(0);
语句中,那么您将陷入更大的混乱,父进程有4个孩子,子进程有3到0个孩子,孙子进程有2到0个孩子。 , 等等..
您需要的是这样的:
for(i = 0; i < 2; ++i){
pid_t ret = fork();
if(ret < 0){
printf("Fork Failed!\n");
return 1;
} else if(ret == 0) { //Children process
pid_t children_ret = fork();
if(children_ret < 0){
printf("Fork Failed!\n");
return 1;
} else if(children_ret == 0) { //Grandchildren process
//... Do whatever you want on the grandchildren process
exit(0);
}
//... Do whatever you want on the children process
wait(NULL);
exit(0);
}
}
//... Do whatever you want on the parent process
wait(NULL);
exit(0);
请注意,对子进程和孙进程的
exit
调用非常重要。这是因为所有进程共享相同的代码,因此,如果它们不在这些点上退出,则它们将继续运行您拥有的所有其余代码(即:孙代将运行子代代码和父代代码)。关于c - 创建一个有四个 child 的流程树,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48663589/