我在创建此流程树时遇到问题。
这是我的代码:
#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分。
答案 0 :(得分:1)
你的缺陷是程序本身的逻辑。首先,您考虑使用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
调用非常重要。这是因为所有进程共享相同的代码,因此如果他们不退出这些代码,他们将继续运行你拥有的任何其他代码(即:孙子将运行子代码和父代码)。