int x=0;
int main()
{
for(i=0;i<2;i++)
{
fork();
x=x+5;
}
return 0;
}
我是fork()
概念的新手。上面的树(x
值)是否是上述C代码的正确解决方案?节点中的值分别是其进程的x
值。
还可以从子进程向父进程返回值吗?假设在上面的示例代码中,我可以将子进程的x
值返回给父进程吗?
答案 0 :(得分:7)
你的意思是,这是一个过程树,在气泡中是x
的值?那不,那不对。
当一个孩子产生时,它会获得父母的精确副本...所以让我们“打印”一些值,这样我们就可以看到事物的状态(我正在为所有事物制作PID)
当我们开始时,它只是父母:
parent (11174) x = 0, i = 0
然后我们点击fork()
,现在我们有两个进程:
+--parent (11174) x = 0, i = 0
|
+->child1 (11175) x = 0, i = 0
接下来的数学:
parent (11174) x = 5, i = 0
child1 (11175) x = 5, i = 0
当我们循环回来时,我们的i会增加,现在每个进程都会运行循环并点击fork()
:
+--parent (11174) x = 5, i = 1
|
+->child2 (11176) x = 5, i = 1
+--child1 (11175) x = 5, i = 1
|
+->child (11177) x = 5, i = 1
现在每个人都会再次尝试数学:
parent (11174) x = 10, i = 1
child2 (11176) x = 10, i = 1
child1 (11175) x = 10, i = 1
child (11177) x = 10, i = 1
最后,每个人都会点击循环并增加i
。所以你的最终结果是:
parent (10)----->child1(10)---->child(10)
|
+----->child2(10)
答案 1 :(得分:6)
如果您拨打fork()
,则下面的代码适用于两个流程,即parent
和child
。
fork
创建一个新进程(称为子进程),其地址空间与父进程不同。所以,他们之间没有任何共享。
你在循环中调用fork,实际上是2次,所以总共会有4个独立进程。
如果您想在子进程中进行单独编码,请始终使用fork()
的返回值,如下所示:
if(!fork())
{
// child process
}
else
{
// parent process
}
如有问题:
And also can we return values to the parent process from the child process?
Suppose lets say in the above example code can I return the x value of the
child to the parent process?
答案是,您无法直接将值从一个进程返回到另一个进程。 使用所谓的概念实现2个或更多个过程之间的通信 可以通过两种方式完成的进程间通信(IPC)。
1. shared memory
2. memssage passing (pipe, rpc)
在解决这个问题之前,你还需要了解很多东西。
特别是当您尝试使用fork
并且还想要返回值
您应该看到this
或者,这可以帮助您more
答案 2 :(得分:2)
fork();
创建一个子进程,并将父进程的所有变量复制到子变量。
<强>父:强>
你的主程序创建2个孩子,正如你在For-Loop中提到的,
创建child1
时,值i
为0
在创建child2
时,值i
为1
<强> Child1:强>
Child1
在fork(),i++
执行后,在下一次迭代(i = 1
)中开始执行 - 条件为真(1 < 2
),Child1
分叉child3
的另一个孩子,child3
i
的值为1
。
Child2和Child3:
在{(1)}执行后,{p>Child2
和Child3
开始执行i = 1
,现在i++
变为i
,条件为false ,没有创建更多的孩子。
在Total中创建的 2
个进程。
<强> CODE:强>
3
<强>输出:强>
int x=0;
int main()
{
for(i=0;i<2;i++)
{
fork();
x=x+5;
}
printf("x = %d\n", x);
return 0;
}