有人可以向我解释为什么这两个相似的代码(\n
位置除外)导致不同的输出:
#include <unistd.h>
#include <sys/wait.h>
#include <stdio.h>
int main()
{
int pid, i=0;
printf("Ready to fork\n");
pid=fork();
if (pid==0)
{
printf("Child starts\n");
for (i=0; i<1000; i++);
printf("Child ends\n");
}
else
{
wait(0);
for (i=0; i<1000; i++);
printf("Parent process ends\n");
}
return 1;
}
输出:
而且:
#include <unistd.h>
#include<sys/wait.h>
#include <stdio.h>
int main()
{
int pid, i=0;
printf("\nReady to fork %d", getpid());
pid=fork();
if (pid==0)
{
printf("\nChild starts %d",getpid());
for (i=0; i<1000; i++);
printf("\nChild ends %d", getpid());
}
else
{
wait(0);
for (i=0; i<1000; i++);
printf("\nParent process ends %d", getpid());
}
return 1;
}
结果:
我真的找不到任何令人满意的理由,为什么\n
位置的简单更改会在fork执行完成后父级程序似乎重新启动的级别上更改程序的输出。
提前谢谢。
答案 0 :(得分:2)
除非程序的输出被重定向到文件,否则printf()
\n
默认情况下会在刷新 用户空间缓冲区中产生printf()
内部使用。
在fork()
暗示子进程获取父进程尚未刷新的缓冲区的副本之前,不刷新缓冲区。因此,您在未打印Ready to fork
的版本中看到\n
两次,因为在调用{{1}之前调用printf()
打印Ready to fork
}。