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语句。但我真的不理解它。所以我画了下面这张图表:
图表已更新以反映评论 :)
观察结果:
- 父进程(主进程)必须迭代循环3次。然后调用printf
- 在每个父for循环的迭代中,都会调用fork()
- 在每次fork()调用之后,i被递增,因此每个子进程在递增之前从i开始执行for循环
- 在每个for循环结束时,都会打印“hi”
以下是我的问题:
- 我的图表正确吗?
- 为什么输出中有两个
i=0
的实例? fork()
后,每个子进程会携带哪个i
的值?如果携带相同的i
值,那么“分叉”何时停止?2^n - 1
是否总是用来计算被分叉的子进程数量的方法?所以,这里n=3
,意味着2^3 - 1 = 8 - 1 = 7
个子进程,这是正确的吗?
fork()
后打印出i
、PID 和父进程的 PID。这样跟踪发生的事情应该很容易。 - Basic