【问题标题】:How to print the child process with their name and pid once under the last child fork()如何在最后一个子 fork() 下打印带有名称和 pid 的子进程
【发布时间】:2019-03-27 18:51:42
【问题描述】:

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

我试图在打印输出命令下进行计数。当它打印一次时,它应该停止并且不再打印。

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

【问题讨论】:

    标签: c++ linux fork


    【解决方案1】:

    注意你的最后一个分叉与 couts 的关系。如果您会注意到,每次打印的孩子 A 的 PID 都是不同的,而其他两个是相同的。如果是孩子,则 PID 将为 0,如果是父母,则 PID 将为其他值。由于孩子 A 打印了两种不同的东西,所以它同时发生在孩子和父母身上。

    【讨论】:

      【解决方案2】:
       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,要么不是。如果x 为零,则从fork 调用返回的进程都不会产生输出。如果x 不为零,则两个进程都会产生输出。所以你的预期输出似乎是不可能的。这些输出行如何运行一次?

      大概,x 是零。所以这两个过程都产生了输出。不同的“子 A”值表明其中一个来自父级,一个来自子级。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-05-19
        • 2013-09-25
        • 2023-04-04
        • 1970-01-01
        • 1970-01-01
        • 2011-02-12
        • 1970-01-01
        • 2021-09-15
        相关资源
        最近更新 更多