如何在最后一个子 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 的子进程的主要内容,如果未能解决你的问题,请参考以下文章