我正在努力制作一个C程序,其中父进程创建了2个子进程,而这2个子进程自己创建了3个子进程。我得到了6个子童进程作为结果,但是6个中有2个是父母的孩子。我似乎无法做到这一点。 任何帮助将非常感谢!
pid_t pid[2];
pid_t pid2[3];
for (i=0;i<2;i++) {
pid[i] = fork();
if (pid[i] == 0) {
break;
}
}
if (pid[0] != 0 && pid[1] != 0) {
// That's the father, it waits for all the childs
printf("The parent process [pid: %d, ppid: %d]\n",getpid(),getppid());
for(i=0;i<2;i++) {
wait(&tmp);
}
} else {
printf("I'm a child process [pid: %d, ppid: %d]\n",getpid(),getppid());
for (k=0; k<3; k++){
pid2[k]=fork();
if (pid2[k]==0){
break;
}
}
if (pid2[0] == 0 && pid2[1] == 0 && pid2[2] == 0){
}
else{
printf("Child of child [pid: %d, ppid: %d]\n",getpid(),getppid());
}
}
答案 0 :(得分:0)
当任何k的pid2[k]
为0时,它是一个孙子
因此,当所有pid2都是正面时,它只是一级孩子:
/* correct code */
if (pid2[0] > 0 && pid2[1] > 0 && pid2[2] > 0){
printf("I am a child with 3 children\n");
}
else{
printf("Child of child [pid: %d, ppid: %d]\n",getpid(),getppid());
}
你写的内容每个初级孩子只会发生一次:第一个孙子k=0
将pid2[0]==0
,并且不会更新pid2[1]
和pid2[2]
,这些可以是随机的还是0,取决于你的编译器
其他大孩子将在pid2[0]
中拥有他们的大哥的pid。
/* incorrect code with additional printf */
if (pid2[0] == 0 && pid2[1] == 0 && pid2[2] == 0){
printf("I am one of the oldest children\n");
}
else {
printf("Child or Younger Child of child [pid: %d, ppid: %d]\n",getpid(),getppid());
}
现在你应该aldo处理fork()
失败的情况(pid< 0
)。