为什么放置 \n 会改变执行顺序

why putting \n alters the order of execution

当我尝试在 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 时,语句的执行顺序 changes.what 是 \n 改变顺序的原因?

stdout行缓冲

当您 printf 将某些内容输出到标准输出时,库会缓冲此内容,直到观察到换行符为止。届时,缓冲区将被刷新,并最终显示在您的控制台上。如果不打印换行符,数据可能会无限期地留在缓冲区中,直到下次打印换行符或进程退出时才会看到。

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

  • fprintf(stderr, ...) 代替。 stderr 没有缓冲;写入其中的数据将立即可见。
  • fflush(stdout) - 手动强制立即刷新流。

更新: 请注意,none 这实际上很重要,因为涉及到固有的竞争条件。你无法控制是父进程还是子进程先执行,哪个数据先写入控制台。您甚至可能会看到交错的输出,因为它们都试图同时打印。 (感谢jschultz410指出我的愚昧)