1. ホーム
  2. c

[解決済み] write() to stdout と printf 出力がインターリーブされていない?

2022-01-30 08:52:08

質問

#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;
}

プログラムの出力(ここで、最初の read と最初の write がユーザーによって入力され、端末によってエコーされる)は

read
read
write
write
n: 5:n: 6:

標準入力でCtrl+Dを押した後にprintfが出力され、その後の読み込みに伴って出力されません。なぜこのようなことが起こるのでしょうか?

解決方法は?

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;
}

一般的には printf() バッファリングされることは良いことです。 バッファリングされていない出力、特に画面の更新などを必要とする目に見えるコンソールへの出力は遅いです。 プリントアウトを多用するアプリケーションが直接的に遅くなるくらい遅いのです(特にWindowsプラットフォームで。LinuxやUnixは一般的に影響が少ないです)。

しかし printf() を使用すると、バッファリングされることになります。 fprintf(stderr,) - stderr は意図的にバッファリングされていません。 その結果、メッセージにいくつかの printf() が欠落している場合、別の FILE ハンドルはターミナルとも関連付けられており、バッファリングされていない可能性があるので、最初に明示的に fflush(stdout) .