我正在学习如何使用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
答案 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打印两种不同的东西,因此在孩子和父母中都发生了。