write()到stdout和printf输出没有交错?

s_i*_*bhu 7 c printf stdout

#include <stdio.h>
#define MAXLEN 256

int main() {
  int n;
  char buf[MAXLEN];
  while((n = read(0,buf,sizeof(buf))) != 0){
    printf("n: %d:",n);
    write(1,buf,n);
  }
  return 1;
}
Run Code Online (Sandbox Code Playgroud)

程序的输出(第一个read和第一个write由用户键入并由终端回显)是:

read
read
write
write
n: 5:n: 6:
Run Code Online (Sandbox Code Playgroud)

printf的输出在标准输入处按Ctrl + D后出现,而不是随后的读取.为什么会这样?

Wil*_*ill 20

Printf是缓冲的.

您可以使用fflush调用强制printf"刷新"其缓冲区:

#include <stdio.h>
#define MAXLEN 256

int main() {
  int n;
  char buf[MAXLEN];
  while((n = read(0,buf,sizeof(buf))) != 0){
    printf("n: %d:",n);
    fflush(stdout); /* force it to go out */
    write(1,buf,n);
  }
  return 1;
}
Run Code Online (Sandbox Code Playgroud)

一般来说,printf()缓冲是一件好事.无缓冲输出,尤其是需要屏幕更新等的可见控制台,速度很慢.足够慢以至于可以直接减慢打印很多的应用程序(特别是在Windows平台上; Linux和unix通常受影响较小).

然而,printf()正在缓冲不会咬你,如果你还fprintf(stderr,)- stderr是故意无缓冲.因此,您可能会printf()丢失一些消息; 如果您写入另一个FILE也与终端关联的句柄,并且可能没有缓冲,请首先明确说明fflush(stdout).

  • 在执行任何IO之前,您还可以使用setvbuf()更改缓冲模式. (6认同)