如果我放置\ n与否,为什么输出的顺序不同

时间:2018-02-23 08:35:40

标签: c process printf fork

我现在正在与福克斯合作,并且在尝试打印过程中时,我遇到了一个奇怪的行为。"。"每秒和第二个打印5" *"每隔几秒钟。

#include <signal.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>

int main(int argc, char const *argv[]) {
  int pid = fork();

  //parent
  if (pid > 0){
    for(int i = 0; i < 5; i++){
      printf("\n*\n");
      sleep(2);
    }
  }
  //child
  else{
    for(int i = 0; i < 10; i++){
      printf("\n.\n");
      sleep(1);
    }
  }
  return 0;
}

使用此代码,我得到以下输出:

  

*

     

     

     

*

     

     

     

*

     

     

     

*

     

     

     

*

     

     

这是我的预期,但如果我从printf函数中删除\ n,就像这样

  printf("*");

然后我得到了这个输出:

  

***** ..........

有没有解释为什么输出的顺序不同?

2 个答案:

答案 0 :(得分:0)

写入同一STDOUT的多个进程只会在刷新时将数据推送到文件描述符。新线刷新,进程退出。因此,当打印换行符时,每行都会在打印时刷新。但如果没有,每个的输出都会被缓冲,直到它退出,然后一次全部写入。

答案 1 :(得分:0)

输出可以在实际写出之前缓存一段时间。输出流中的\n通常会触发当前输出流以进行刷新。没有\n,看起来输出在程序退出之前没有刷新,然后一切都被写出来了。