Linux中printf(“ n ...”)和printf(“.. n”)之间的输出差异[重复]
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux中printf(“ n ...”)和printf(“.. n”)之间的输出差异[重复]相关的知识,希望对你有一定的参考价值。
这个问题在这里已有答案:
有人可以向我解释为什么这两个相似的代码(除了
位置)导致不同的输出:
#include <unistd.h>
#include <sys/wait.h>
#include <stdio.h>
int main()
{
int pid, i=0;
printf("Ready to fork
");
pid=fork();
if (pid==0)
{
printf("Child starts
");
for (i=0; i<1000; i++);
printf("Child ends
");
}
else
{
wait(0);
for (i=0; i<1000; i++);
printf("Parent process ends
");
}
return 1;
}
输出:
还有这个:
#include <unistd.h>
#include<sys/wait.h>
#include <stdio.h>
int main()
{
int pid, i=0;
printf("
Ready to fork %d", getpid());
pid=fork();
if (pid==0)
{
printf("
Child starts %d",getpid());
for (i=0; i<1000; i++);
printf("
Child ends %d", getpid());
}
else
{
wait(0);
for (i=0; i<1000; i++);
printf("
Parent process ends %d", getpid());
}
return 1;
}
结果是:
我真的找不到任何令人满意的理由为什么
的位置的简单改变在fork执行完成后父级程序似乎重新启动的级别上改变了程序的输出。
先感谢您。
答案
除非程序的输出被重定向到文件,否则printf()
ing
默认会刷新printf()
内部使用的用户空间缓冲区。
在fork()
暗示子进程获得父进程尚未刷新的缓冲区的副本之前,不刷新缓冲区。出于这个原因,你在版本中看到Ready to fork
两次没有打印
,因为调用printf()
打印Ready to fork
是在调用fork()
之前执行的。
以上是关于Linux中printf(“ n ...”)和printf(“.. n”)之间的输出差异[重复]的主要内容,如果未能解决你的问题,请参考以下文章