簡體   English   中英

使用Fork()創建只有兩個孫子進程的三個子進程

[英]Use Fork() to create three child processes with only 2 grandchild processes

使用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        

您正在處理fork()成功返回兩次的事實:一次在父進程中,一次在子進程中。 這些情況可以通過返回值來區分。 由於fork() 確實會在每個子代返回,因此將值分配給lchildpidmchildpidrchildpid並沒有多大意義,因為每個進程都會擁有自己的這些變量副本。 如果分叉按照您的要求工作,則其中一些副本將被初始化,而其他副本則不會。

可能寫產生你提出的分叉模式,通過利用的短路行為的一個表達式&&|| 運算符,並且fork()的返回值在父級中計算為true(即使在fork()失敗時),在子級計算為false。 如果您需要這樣做,請三思而后行-您將解決它。 提示:根據需要使用括號,如果需要,可以在&&||之間包含一個整數常量。 操作數以指示這些操作的結果。

編寫一個完成所有分叉的表達式是一個很有趣的問題。 如果你沒有這樣做,但是,那么它可能會更容易,只需使用ifswitch語句轉移到正確的行為,為每個結果fork() 那將是在實際程序中通常如何使用fork()更多特征。

希望對您有所幫助,但是如果您正在尋找某人為您做家庭作業,那么恐怕會讓您失望。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM