gpt4 book ai didi

c - 在 For 循环中 fork() 发生了什么

转载 作者:太空狗 更新时间:2023-10-29 16:16:50 26 4
gpt4 key购买 nike

我一直在努力理解fork()行为。这次在 for 循环 中。观察以下代码:

#include <stdio.h>

void main()
{
int i;

for (i=0;i<3;i++)
{
fork();

// This printf statement is for debugging purposes
// getppid(): gets the parent process-id
// getpid(): get child process-id

printf("[%d] [%d] i=%d\n", getppid(), getpid(), i);
}

printf("[%d] [%d] hi\n", getppid(), getpid());
}

这是输出:

[6909][6936] i=0
[6909][6936] i=1
[6936][6938] i=1
[6909][6936] i=2
[6909][6936] hi
[6936][6938] i=2
[6936][6938] hi
[6938][6940] i=2
[6938][6940] hi
[1][6937] i=0
[1][6939] i=2
[1][6939] hi
[1][6937] i=1
[6937][6941] i=1
[1][6937] i=2
[1][6937] hi
[6937][6941] i=2
[6937][6941] hi
[6937][6942] i=2
[6937][6942] hi
[1][6943] i=2
[1][6943] hi

我是一个非常注重视觉的人,所以我真正理解事物的唯一方法是通过图表。我的导师说会有 8 个 hi 语句。我编写并运行了代码,确实有 8 个 hi 语句。但我真的不明白。所以我画了下图:

enter image description here

图表已更新以反射(reflect)评论:)

观察:

  1. 父进程(主)必须重复循环 3 次。然后调用 printf
  2. 在父 for 循环的每次迭代中都会调用 fork()
  3. 在每次 fork() 调用后,i 递增,因此每个 child 在递增之前从 i 开始一个 for 循环
  4. 在每个 for 循环的末尾,打印“hi”

这是我的问题:

  • 我的图表正确吗?
  • 为什么输出中有两个 i=0 实例?
  • i 的什么值在 fork() 之后传递给每个 child ?如果 i 的值相同,那么“ fork ”何时停止?
  • 2^n - 1 是否始终是一种计算 fork 子节点数量的方法?所以,这里 n=3,这意味着 2^3 - 1 = 8 - 1 = 7 个 child ,这是正确的吗?

最佳答案

这里是如何理解它,从for开始循环。

  1. 循环从父级开始,i == 0

  2. 父级 fork() s,创建 child 1。

  3. 您现在有两个进程。都打印i=0 .

  4. 循环在两个进程中重新启动,现在 i == 1 .

  5. 父子 1 fork() ,创建 child 2 和 3。

  6. 您现在有四个进程。所有四个打印i=1 .

  7. 循环在所有四个进程中重新启动,现在 i == 2 .

  8. parent 和 child 1 到 3 所有 fork() ,创造 4 到 7 岁的 child 。

  9. 您现在有八个进程。全八印i=2 .

  10. 循环在所有八个进程中重新启动,现在 i == 3 .

  11. 循环在所有八个进程中终止,如i < 3不再是真的。

  12. 所有八个进程打印 hi .

  13. 所有八个进程终止。

所以你得到 0打印两次,1打印四次,2打印 8 次,hi打印 8 次。

关于c - 在 For 循环中 fork() 发生了什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26793402/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com