我一直在试图了解fork()
行为。这次在for-loop
。观察以下代码:
#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个喜词。我编写并运行了代码,实际上有8个hi语句。但是我真的不明白。所以我画了下图:
该图已更新以反映评论:)
观察结果:
- 父进程(主进程)必须将循环迭代3次。然后调用printf
- 在父级for循环的每次迭代中,都会调用fork()
- 在每次fork()调用之后,i都会递增,因此每个孩子都会在i递增之前从其开始for循环
- 在每个for循环的末尾,均会打印“ hi”
这是我的问题:
- 我的图表正确吗?
- 为什么在输出中有两个实例
i=0
? i
在fork()之后,将什么值带给每个孩子?如果i
结转了相同的值,那么“分叉”何时停止?- 是否总是
2^n - 1
会这样一种方法来计算分叉的孩子数量?那么,在这里n=3
,这意味着2^3 - 1 = 8 - 1 = 7
孩子,哪个是正确的?
i
PID和父PIDfork()
。跟踪正在发生的事情应该很容易