6
int x=0;
int main()
{
  for(i=0;i<2;i++)
  {
    fork();
    x=x+5;
  }
  return 0;
}

图表

我是这个fork()概念的新手。上面的树(带x值)是上面提到的 C 代码的正确解决方案吗?节点中的x值分别是其进程的值。

我们也可以将值从子进程返回给父进程吗?假设在上面的示例代码中,我可以x将子进程的值返回给父进程吗?

4

3 回答 3

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)
于 2012-11-28T19:13:36.730 回答
6

如果您调用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并且还想要返回值时

你应该看到这个

或者,这可能对您有更多帮助

于 2012-11-28T19:02:12.323 回答
2
fork();

创建一个子进程并将父进程的所有变量复制到子变量。

家长:

正如您在 For-Loop 中提到的,您的主程序创建了 2 个子程序,当它创建时child1,值i0 当它创建时child2,值i1

孩子1:

Child1在 fork() 之后开始i++执行,在下一次迭代 ( i = 1) 中执行 - 条件为真 ( 1 < 2),在is的值中Child1分叉另一个子节点is 。child3child3i1

儿童 2 和儿童 3:

Child2并在 fork() 执行后Child3开始执行,现在变为,条件为假,不再创建子项。i = 1i++i2

3Total 中创建的流程。

代码:

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
于 2012-11-28T19:21:39.347 回答