【问题标题】:How to solve this fork() example in c如何在 c 中解决这个 fork() 示例
【发布时间】:2012-11-16 17:35:06
【问题描述】:
int x=0;
int main()
{
  for(i=0;i<2;i++)
  {
    fork();
    x=x+5;
  }
  return 0;
}

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

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

【问题讨论】:

  • 那甚至无法编译。
  • 不太清楚你的图是什么意思,但假设(有向)边代表父子进程关系并且根是原始进程,那么 5 应该是 10,因为 4 个进程中的每一个最终将 x 增加 5 两次。不管怎样,你到底想要做什么?
  • 是的。图中的根代表开始的原始过程,有向边显示父子关系。我想知道的是-总共形成了多少个节点以及x值是否在各个节点中是否正确?谢谢。
  • 该图中有大量令人分心的空白。

标签: c unix process operating-system fork


【解决方案1】:

如果您调用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

【讨论】:

  • 任何时候,但记住解决这个问题对你没有多大帮助,试着了解 fork 或任何进程创建和通信背后的概念
【解决方案2】:

您的意思是这是一个进程树,而在气泡中是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)

【讨论】:

  • 很好的解释。现在我清楚地知道如何解决这些问题了。谢谢:)
  • @user1632141 - 乐于助人!写下这些步骤很有用,这样您就可以看到它在工作,如果您无法在脑海中完成它,那么编译您的小示例代码并添加一些 printfs,例如:printf("process %d: x = %d, i = %d\n", getpid(), x, i); 将是一个不错的起点!
【解决方案3】:
fork();

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

家长:

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

孩子 1:

Child1 在 fork() 之后开始执行,i++ 执行,在下一次迭代中(i = 1) - 条件为真 (1 &lt; 2),Child1 派生另一个子代 child3,在child3i的值为1

Child2 和 Child3:

Child2Child3 在 fork() 之后以 i = 1 开始执行,i++ 执行后,现在 i 变为 2,条件为 false,不会再创建子代。

3 总共创建的进程。

代码:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-07
    • 2016-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-07
    • 1970-01-01
    相关资源
    最近更新 更多