当我尝试用c代码进行僵尸进程模拟时,由于在printf语句中输入了\ n,我输出的结果发生了变化:
代码1:
main()
{
int id;
id=fork();
if(id>0)
{
printf("Parent will sleep");//pf1//
sleep(5);
//system("ps -u");
}
if(id==0)
printf("I am child");//pf2//
}
输出:
I am childParent will sleep
但是当把\ n放在pf1或pf2中时,语句的执行顺序会发生变化。\ n \ n改变顺序背后的原因是什么?
答案 0 :(得分:6)
stdout
行缓冲。
当您{stdout} printf
时,库会缓存此内容,直到观察到换行符。此时,刷新缓冲区,最终将显示在控制台上。如果您不打印换行符,数据可能会无限期地保留在缓冲区中,直到您下次打印换行符或进程退出时才能看到它。
为确保您的打印件始终可见,您可以执行以下操作之一:
fprintf(stderr, ...)
代替。 stderr
未缓冲;写入的数据将立即显示。fflush(stdout)
- 手动强制立即刷新流。更新:请注意,由于涉及固有的竞争条件,这些都不重要。您无法控制父进程或子进程是否先执行,以及哪些数据将首先写入控制台。你甚至可能看到输出交错,因为它们都试图同时打印。 (感谢jschultz410指出我的愚蠢。)