【问题标题】:Use Fork() to create three child processes with only 2 grandchild processes使用 Fork() 创建三个子进程,只有 2 个孙子进程
【发布时间】:2024-01-14 13:40:01
【问题描述】:

使用 fork() 创建子进程,我正在尝试制作一个如下所示的树:

    p
  / | \
 p  p  p
   / \
  p   p

我让父进程创建了三个子进程,但我无法让两个外部子进程停止分叉,而第二个子进程只分叉两次。

这是我的代码:

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>

int main ()
 {

pid_t lchildpid, rchildpid,mchildpid, parentpid;
int n = 0;
lchildpid = 0;
rchildpid = 0;
mchildpid = 0;


 printf("\nLvl\tProc\tParent\tChild 1\tChild 2\tChild 3\n");
printf("No.\tID\tID\tID\tID\tID\n");

 while(n < 3){


if((lchildpid = fork()) == 0 || (mchildpid = fork()) == 0 || (rchildpid = fork()) == 0) {

        parentpid = getppid();
        n++;
        continue;

    }

    //check for forking errors
    if(lchildpid == -1 || rchildpid == -1 || mchildpid == -1) 
    {
        perror("\n The fork failed\n");
        exit(1);
    }

    //If current fork has two children, print complete generation to console and exit while loop
    if(lchildpid && rchildpid && mchildpid ){
        printf("%d\t%ld\t%ld\t%ld\t%ld\t%ld\n",n, (long)getpid(), (long)getppid(), (long)lchildpid, (long)mchildpid,(long)rchildpid);
        break;


      }

 }
       exit(0);
 }      

这是我的输出:

   Lvl     Proc    Parent  Child 1 Child 2 Child 3                                                                                                                                   
   No.     ID      ID      ID      ID      ID                                                                                                                                        
    0       22      7       23      24      25                                                                                                                                        
    1       23      1       26      28      32                                                                                                                                        
    1       25      1       29      31      33                                                                                                                                        
    1       24      1       27      30      34                                                                                                                                

我想要这个输出:

    Lvl     Proc    Parent  Child 1 Child 2 Child 3                                                                                                                                   
    No.     ID      ID      ID      ID      ID                                                                                                                                        
     0       40      7       41      42      43                                                                                                                                        
     1       41      40       0       0      0                                                                                                                                
     1       42      40      44      45      0                                                                                                                                        
     1       43      40       0       0      0        

【问题讨论】:

标签: c fork


【解决方案1】:

您正在处理fork() 返回两次(成功时)的事实:一次在父进程中,一次在子进程中。这些情况可以通过返回值来区分。由于fork()确实在每个子进程中返回,因此将值分配给lchildpidmchildpidrchildpid 没有多大意义,因为每个进程都有自己的副本这些变量中。如果分叉按您的意愿工作,那么其中一些副本将被初始化,而另一些则不会。

可以编写一个表达式来生成您提出的分叉模式,通过利用 &amp;&amp;|| 运算符的短路行为以及以下事实: fork() 的返回值在父级中计算为真(即使fork() 失败),在子级中计算为假。如果您需要这样做,请考虑一下并摆弄一下-您会解决的。提示:根据需要使用括号,如果需要,您可以在 &amp;&amp;|| 操作数中包含一个整数常量来指示这些操作的结果。

编写一个执行所有分叉的表达式是一个有趣的问题。但是,如果您必须这样做,那么只使用ifswitch 语句为每个fork() 的结果分支到适当的行为可能会更容易。这将更符合fork() 通常在实际程序中的使用方式。

我希望这会有所帮助,但是如果您正在寻找某人为您做作业,那么恐怕我将不得不让您失望。

【讨论】:

  • 对不起,我不是在寻找任何人来做我的硬件。我得到了一个关于 fork()s 的实验室,但没有解释它们是如何工作的。我只是被告知要谷歌它,所以我一直在拼凑信息。