3

これは stdout のバッファリングが原因であることはわかっていますが、次のプログラムでいつ stdout の出力を期待できますか。実行すると、常に「stderr」が出力されます。'\n' または fflush(stdout) を追加すると、両方のステートメントが取得されます。「\n」または fflush(stdout) を追加しないと、「stdout」が出力されません。'\n' または fflush(stdout) を追加しない場合、いつバッファリングされたすべての「stdout」を出力として取得できますか。

#include <stdio.h>
#include <unistd.h>
int main()
{
      for(;;)
      {
              fprintf(stdout,"stdout");
              fprintf(stderr,"stderr");
              sleep(1);
      }
      return 0;
} 
4

3 に答える 3

4

実際、デフォルトstdoutでは、端末デバイスを参照するときに行がバッファリングされるため、新しい行またはフラッシュです。

より正確に言えば、標準入力と標準出力は、対話型デバイスを参照していない場合に限り、完全にバッファリングされます。標準エラーが完全にバッファリングされることはありません。

ラインバッファリングについて、APUEからの引用:

行バッファリングには 2 つの注意事項があります。まず、標準 I/O ライブラリが各行を収集するために使用するバッファーのサイズは固定されているため、改行を書き込む前にこのバッファーをいっぱいにすると I/O が発生する可能性があります。次に、標準 I/O ライブラリを介して (a) バッファなしストリームまたは (b) ライン バッファ ストリーム (カーネルからデータを要求する必要がある) のいずれかから入力が要求されるたびに、すべてのライン バッファ出力ストリームがフラッシュされます。(b) の修飾子の理由は、要求されたデータが既にバッファーにある可能性があり、カーネルからデータを読み取る必要がないためです。明らかに、バッファリングされていないストリーム (項目 (a)) からの入力には、カーネルからデータを取得する必要があります。

バッファなしに変更するには、次を使用しますsetvbuf

setvbuf(stdout, NULL, _IONBF, 0);
于 2013-07-15T15:32:18.897 に答える