sta*_*k92 6 c unix operating-system fork process
int x=0;
int main()
{
for(i=0;i<2;i++)
{
fork();
x=x+5;
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)

我是这个fork()概念的新手.上面的树(带有x值)是上面提到的C代码的正确解决方案吗?节点中的x值分别是其进程的值.
我们还可以从子进程返回父进程的值吗?假设在上面的示例代码中,我可以x将子进程的值返回给父进程吗?
你的意思是,这是一个过程树,在气泡中是值x?那不,那不对.
当一个孩子产生时,它会获得父母的精确副本......所以让我们"打印"一些值,这样我们就可以看到事物的状态(我正在为所有东西制作PID)
当我们开始时,它只是父母:
parent (11174) x = 0, i = 0
Run Code Online (Sandbox Code Playgroud)
然后我们点击了fork(),现在我们有两个过程:
+--parent (11174) x = 0, i = 0
|
+->child1 (11175) x = 0, i = 0
Run Code Online (Sandbox Code Playgroud)
接下来的数学:
parent (11174) x = 5, i = 0
child1 (11175) x = 5, i = 0
Run Code Online (Sandbox Code Playgroud)
当我们循环回来时,我们的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
Run Code Online (Sandbox Code Playgroud)
现在每个人都再次尝试数学:
parent (11174) x = 10, i = 1
child2 (11176) x = 10, i = 1
child1 (11175) x = 10, i = 1
child (11177) x = 10, i = 1
Run Code Online (Sandbox Code Playgroud)
最后,每个人都会进入循环并增加 i突破.所以你的最终结果是:
parent (10)----->child1(10)---->child(10)
|
+----->child2(10)
Run Code Online (Sandbox Code Playgroud)
如果你打电话给fork()下面的代码,那么这两个过程就是parent和child.
fork创建一个新进程(称为子进程),其地址空间与父进程不同.所以,他们之间没有任何共享.
你在循环中调用fork,实际上是2次,所以总共会有4个独立的进程.
如果要在子进程中进行单独编码,请始终使用如下所返回的值fork():
if(!fork())
{
// child process
}
else
{
// parent process
}
Run Code Online (Sandbox Code Playgroud)
如有问题:
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?
Run Code Online (Sandbox Code Playgroud)
答案是,您无法直接将值从一个进程返回到另一个进程.使用称为Inter process commmunicaton(IPC)的概念可以实现2个或更多进程之间的通信,您可以通过两种方式完成此过程.
1. shared memory
2. memssage passing (pipe, rpc)
Run Code Online (Sandbox Code Playgroud)
在解决这个问题之前,你还需要了解很多东西.特别是当您尝试使用它fork并且还想返回值时
你应该看到这个
或者,这可以帮助你更多