我正在检查fork系统调用的行为。我执行了以下程序。
#include<stdio.h>
int count=0;
int main()
{
int i;
int n=3;
for(i=1;i<=n;++i)
{
printf(" %d ",i);
fork();
}
}
我原以为fork()
里面有for loop
类似于连续编写,即
for(i=1;i<=3;i++)
fork();
类似于
fork();
fork();
fork();
我预计输出将是连续八个3。但是产出如下:
1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3
注意:在gcc中编译和执行
答案 0 :(得分:2)
首先,你的期望是错误的,你将获得超过3的输出。其次,fork时会保留stdout
行缓冲区,因此会将以前printf
- ed内容复制到分叉进程,作为进程复制的一部分。以下修改后的程序版本:
#include <stdio.h>
#include <unistd.h>
int main()
{
int i;
for(i=1;i<=3;++i)
{
printf("%d ", i);
fflush(stdout);
fork();
}
}
将生成与类似的输出:
1 2 3 2 3 3 3
添加的冲洗清空当前流程&#39; fork之前的stdout行,从而消除了重复输出。订单可能略有不同,但始终以1
开头,以3
结尾,此外,任何1
后面至少会跟一个2
,任意2
后面至少有一个3
答案 1 :(得分:1)
它会像那样打印
1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3
因为父母有1次,孩子有1次。
Fork(): - 为父母和孩子。
所以循环旋转4次
1 2 3为父母1 2 3为儿童
2(父母和孩子)* 4(循环旋转)=它将打印8次(1 2 3)
答案 2 :(得分:1)
答案 3 :(得分:1)
因为stdout
输出默认是缓冲的,因此分支过程将导致复制缓冲区,并且每个进程完成后,每个缓冲区都将被刷新。
使用:
fprintf(stderr," %d ",i);
将使程序输出:
1 2 2 3 3 3 3
因为你在循环中创建了printf语句(从1到3)
以下语句将帮助您跟踪输出:
fprintf(stderr," %d:%d ",i,getpid());
将输出(示例):
1:24100 2:24100 2:24101 3:24100 3:24102 3:24101 3:24103