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

标签 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值返回给父进程吗?

最佳答案

你的意思是那是一个进程树并且在气泡中是 x 的值?那么不,那是不正确的。

当一个 child 被生成时,它会得到父代的精确副本......所以让我们“打印”一些值,以便我们可以看到事物的状态(我正在为所有东西制作 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)

关于c - 如何在 c 中解决这个 fork() 示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13612333/

相关文章:

java - 在 Java 中获取计算机内存信息

c - 获取 C 程序使用的峰值内存量

c - 为什么 sscanf 不适用于这种情况?

c - Ncurses 窗口缩放

linux - 用双引号分隔两个字符串

java - 如何在运行时将参数传递给进程

c++ - 访问堆中的数据比访问栈中的数据快吗?

java - 在Java中创建文件时如何设置文件所有者/组

linux - Unix 中如何处理信号?

c - 如何让函数在不同的地址空间中执行?编写克隆函数