c中fork()系统调用的混乱行为

时间:2016-07-20 10:36:23

标签: c fork

我正在检查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();

我试图为它绘制一个递归树 enter image description here

我预计输出将是连续八个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中编译和执行

4 个答案:

答案 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)

以前曾问过这个问题。你可以在这里找到类似的问题。

Visually what happens to fork() in a For Loop

我希望有所帮助^^

答案 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