如何在c中解决这个fork()示例

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将子进程的值返回给父进程吗?

Mik*_*ike 7

你的意思是,这是一个过程树,在气泡中是值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)


Omk*_*ant 6

如果你打电话给fork()下面的代码,那么这两个过程就是parentchild.

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并且还想返回值时

你应该看到这个

或者,这可以帮助你更多