for循环中的fork()有2次迭代
fork() in a for loop with 2 iterations
以下代码的输出是什么:
#include <stdio.h>
void main()
{
int i;
for (i=0;i<2;i++)
{
fork();
printf("1\n");
}
printf("2\n");
}
在讲座中,教授 运行 代码和输出有六个 1 和四个 2,但我不明白我们是如何获得这些数字的。
让我们以树的形式“绘制”流程,并标记出 printf
调用发生的位置,然后计算每种类型的 printf
调用:
parent
|
fork
^
parent -------/ \------------ child
| |
printf("1") printf("1")
| |
loop iterates loop iterates
| |
fork fork
^ ^
parent --/ \----- grandchild child --/ \----- grandchild
| | | |
printf("1") printf("1") printf("1") printf("1")
| | | |
loop ends loop ends loop ends loop ends
| | | |
printf("2") printf("2") printf("2") printf("2")
| | | |
proc ends proc ends proc ends proc ends
正如我们所见,有六个 printf("1")
个调用和四个 printf("2")
个调用。
[我没有在printf
调用中添加换行符,该图仅用于计算调用次数。实际输出可能因缓冲而异,具体取决于 stdout
目标。]
以下代码的输出是什么:
#include <stdio.h>
void main()
{
int i;
for (i=0;i<2;i++)
{
fork();
printf("1\n");
}
printf("2\n");
}
在讲座中,教授 运行 代码和输出有六个 1 和四个 2,但我不明白我们是如何获得这些数字的。
让我们以树的形式“绘制”流程,并标记出 printf
调用发生的位置,然后计算每种类型的 printf
调用:
parent | fork ^ parent -------/ \------------ child | | printf("1") printf("1") | | loop iterates loop iterates | | fork fork ^ ^ parent --/ \----- grandchild child --/ \----- grandchild | | | | printf("1") printf("1") printf("1") printf("1") | | | | loop ends loop ends loop ends loop ends | | | | printf("2") printf("2") printf("2") printf("2") | | | | proc ends proc ends proc ends proc ends
正如我们所见,有六个 printf("1")
个调用和四个 printf("2")
个调用。
[我没有在printf
调用中添加换行符,该图仅用于计算调用次数。实际输出可能因缓冲而异,具体取决于 stdout
目标。]