fork()的意外行为

时间:2015-10-21 08:28:18

标签: c fork

我正在使用fork()进行一些C程序 但是我得到了意想不到的输出。

#include <stdio.h>

main(){
  printf("\nStart of Program");
  fork();
  printf("\nEnd of Program");
}

输出:

  

计划开始
  程序开始程序结束   计划结束

为什么我会得到这个输出?

输出应为:

  

计划开始
  计划结束
  计划结束

5 个答案:

答案 0 :(得分:2)

由于缓冲,这个问题正在发生。

引用this帖子。

  

当程序输出到终端(屏幕)时,它是行缓冲的。当程序的输出进入管道时,它是完全缓冲的。

这些帖子还包含逐行说明。

答案 1 :(得分:0)

这是因为printf(),printf正在缓冲输出并且只在到达&#39; \ n&#39;时打印,所以当到达printf("\nEnd of Program");时printf()打印出的内容缓冲区是&#34;程序开始&#34;。 因为fork()复制了堆栈,所以printf()缓冲区也是重复的。 尝试:

#include<stdio.h>
main(){
printf("Start of Program\n");
fork();
printf("End of Program\n");
}

答案 2 :(得分:0)

这里很少有东西需要检查。

从哪里打印“学生”。我没有看到你在代码中打印学生的任何地方。

理想的输出是

  

计划开始
  计划结束
  程序结束

如果你没有超过输出,我会怀疑,当fork执行并且子项被创建时,可能你的标准输出打印不完整。刷新或\ n作为打印中的最后一个字符是必须完成打印作业,

要验证这一点,你可以做的是,在fork之前只使用fflush。 同样在printf中使用\ n作为最后一个char。

#include<stdio.h>
main()
{
    printf("Start of Program\n");
    fflush(NULL);
    fork();
    printf("End of Program\n");
}

试试这个并告诉我们。

答案 3 :(得分:0)

when fork is come then new process is created. 

在fork调用进程之前和fork调用之后的程序结束。这就是逻辑。

答案 4 :(得分:-2)

我自己编译了这段代码,并得到以下输出:

  

计划开始

     

计划结束

     

计划开始

     

计划结束

这是正确的,因为fork()产生了与其分叉完全相同的子进程。

编辑:感谢评论,我发现了最新情况。 Fork的行为与预期一致,但输入缓冲区在执行子进程之前不会被刷新。我已将原始代码修改为:

#include <stdio.h>

main(){
  printf("\nStart of Program\n");
  fflush(stdout);
  fork();
  printf("\nEnd of Program\n");
}

输出现在显示为:

  

计划开始

     

计划结束

     

计划结束

这表明确实,fork()仅产生从fork()调用之后向下执行的子进程。