我正在使用fork()
进行一些C程序
但是我得到了意想不到的输出。
#include <stdio.h>
main(){
printf("\nStart of Program");
fork();
printf("\nEnd of Program");
}
输出:
计划开始
程序开始程序结束 计划结束
为什么我会得到这个输出?
输出应为:
计划开始
计划结束
计划结束
答案 0 :(得分:2)
答案 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()
调用之后向下执行的子进程。