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

时间:2012-11-28 18:51:48

标签: c unix process operating-system fork

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

diagram

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

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

3 个答案:

答案 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(),则下面的代码适用于两个流程,即parentchild

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时,值i0 在创建child2时,值i1

<强> Child1:

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

Child2和Child3:

在{(1)}执行后,{p> Child2Child3开始执行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;
}