int x=0;
int main()
{
for(i=0;i<2;i++)
{
fork();
x=x+5;
}
return 0;
}
我是这个fork()
概念的新手。上面的树(带x
值)是上面提到的 C 代码的正确解决方案吗?节点中的x
值分别是其进程的值。
我们也可以将值从子进程返回给父进程吗?假设在上面的示例代码中,我可以x
将子进程的值返回给父进程吗?
int x=0;
int main()
{
for(i=0;i<2;i++)
{
fork();
x=x+5;
}
return 0;
}
我是这个fork()
概念的新手。上面的树(带x
值)是上面提到的 C 代码的正确解决方案吗?节点中的x
值分别是其进程的值。
我们也可以将值从子进程返回给父进程吗?假设在上面的示例代码中,我可以x
将子进程的值返回给父进程吗?
你的意思是那是一个进程树,在气泡中是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)
如果您调用fork()
then 代码,则它适用于两个进程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?
答案是,你不能直接从一个进程返回一个值到另一个进程。两个或多个进程之间的通信是使用称为进程间通信(IPC)的概念实现的,您可以通过两种方式完成。
1. shared memory
2. memssage passing (pipe, rpc)
在解决这个问题之前,您还必须了解很多事情。特别是当您尝试使用fork
并且还想要返回值时
你应该看到这个
或者,这可能对您有更多帮助
fork();
创建一个子进程并将父进程的所有变量复制到子变量。
家长:
正如您在 For-Loop 中提到的,您的主程序创建了 2 个子程序,当它创建时child1
,值i
是0
当它创建时child2
,值i
是1
孩子1:
Child1
在 fork() 之后开始i++
执行,在下一次迭代 ( i = 1
) 中执行 - 条件为真 ( 1 < 2
),在is的值中Child1
分叉另一个子节点is 。child3
child3
i
1
儿童 2 和儿童 3:
Child2
并在 fork() 执行后Child3
开始执行,现在变为,条件为假,不再创建子项。i = 1
i++
i
2
3
Total 中创建的流程。
代码:
int x=0;
int main()
{
for(i=0;i<2;i++)
{
fork();
x=x+5;
}
printf("x = %d\n", x);
return 0;
}
输出:
x = 10
x = 10
x = 10
x = 10