如何在最后一个子for​​k()下使用其名称和pid一次打印子进程

时间:2019-03-27 18:51:43

标签: c++ linux fork

我正在学习如何使用C ++ fork()方法在Linux中生成进程。当我尝试用ChildA,B,C打印出他们的pid时,我已经创建了。它打印两次。如果我只希望它们打印一次,我该如何更改代码。

我试图在print out命令下进行计数。一旦打印完,它应该停止并且不再打印。

child_C=fork();
if(Child_C==0){
  //do some function here;
}else{
  child_B=fork();
  if(Child_B==0){
    //do some function here;
    }else{
     child_A=fork();
     if(x==0){
        cout<<"i am child A" << child_A << "\n";
        cout<<"i am child B" << child_B << "\n";
        cout<<"i am child C" << child_C << "\n";
        x++;
     }
     if(Child_A==0){
        //do some function here;
     }else{
         //do some function here;
     }
  }
}

我希望输出:

i am child A 123
i am child B 234
i am child C 345

但它会打印出来:

i am child A 123
i am child B 234
i am child C 345
i am child A 0
i am child B 234
i am child C 345

2 个答案:

答案 0 :(得分:1)

 child_A=fork();
 if(x==0){
    cout<<"i am child A" << child_A << "\n";
    cout<<"i am child B" << child_B << "\n";
    cout<<"i am child C" << child_C << "\n";
    x++;
 }

x为0或不是0。如果x为零,则从fork调用返回的所有进程都不会产生输出。如果x不为零,则两个进程都将产生输出。因此,您的预期输出似乎是不可能的。每个输出线如何运行一次?

大概x为零。因此,这两个过程都产生了输出。不同的“子级A”值表示其中一个来自父级,另一个来自子级。

答案 1 :(得分:1)

请注意最后一个叉子相对于母鹿的位置。如果您会注意到,子A的PID每次打印都不同,而其他两个相同。如果是子代,则PID将为0;如果是父代,则PID将为其他值。由于孩子A打印两种不同的东西,因此在孩子和父母中都发生了。