如何在最后一个子 fork() 下打印带有名称和 pid 的子进程

Posted

技术标签:

【中文标题】如何在最后一个子 fork() 下打印带有名称和 pid 的子进程【英文标题】:How to print the child process with their name and pid once under the last child fork() 【发布时间】: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

【问题讨论】:

【参考方案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”值表明其中一个来自父级,一个来自子级。

【讨论】:

以上是关于如何在最后一个子 fork() 下打印带有名称和 pid 的子进程的主要内容,如果未能解决你的问题,请参考以下文章

OS fork 练习

使用fork()获取孩子的孩子

如何在 nodejs 中侦听和生成多个子进程

如何在 Flutter 中使用带有打印机名称的以太网 POS 打印机打印收据?

如何使用 Fork() 只创建 2 个子进程?

使用 XSLT 选择最后一个子元素