为什么要改变执行的顺序

时间:2015-03-02 04:10:58

标签: c++ c sleep zombie-process

当我尝试用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改变顺序背后的原因是什么?

1 个答案:

答案 0 :(得分:6)

stdout 行缓冲

当您{stdout} printf时,库会缓存此内容,直到观察到换行符。此时,刷新缓冲区,最终将显示在控制台上。如果您不打印换行符,数据可能会无限期地保留在缓冲区中,直到您下次打印换行符或进程退出时才能看到它。

为确保您的打印件始终可见,您可以执行以下操作之一:

  • fprintf(stderr, ...)代替。 stderr未缓冲;写入的数据将立即显示。
  • fflush(stdout) - 手动强制立即刷新流。

更新:请注意,由于涉及固有的竞争条件,这些都不重要。您无法控制父进程或子进程是否先执行,以及哪些数据将首先写入控制台。你甚至可能看到输出交错,因为它们都试图同时打印。 (感谢jschultz410指出我的愚蠢。