1

の使用法について読んでいたときに、 (バッファリングなし) モードsetvbuf()に出くわしました。_IONBFそのため、バッファリングを無効にしようとすると、stdin と stdout がどのように影響を受けるのか興味がありました。以下はコード例です:

コード :

#include <stdio.h>

int main(void)
{

   int num;
   char a;
   setvbuf(stdin, NULL, _IONBF, 0); //turn off buffering
   scanf("%d", &num);
   a = getchar();
   printf("%d %c\n", num , a);

       return 0;
}

質問 :

1.) 上記のコードから、プログラム (123aおよびその他) に与えたサンプル入力は、たとえ含まれていなくても同じ出力を生成しますsetvbuf()

2.) バッファーは、データのチャンクを入れることができる中間ストレージであり、バッファーがいっぱいになるか、改行が指定されたときに、それらすべてのデータが入力ストリームまたは出力ストリームに送信されることを理解しています。

3.)では、バッファを無効にするとどのような影響がありますか? 性能的にはどうか。

4

1 に答える 1

4

これは、一部はパフォーマンスであり、一部はストリーム ライブラリ関数 (fread、fgets、fprintf など) がデバイス/ファイルへの実際の I/O に関連する方法を制御することです。

たとえば、キャラクタ デバイス (端末など) へのストリーム出力は、デフォルトでライン バッファリングされます。これの効果は、次のコード、

printf("start ");
sleep(10);
printf("stop\n");

10 秒待ってからstart stop[NL] を出力します。バッファをフラッシュする改行がないため、最初の印刷はバッファリングされました。印刷してから 10 秒間スリープするには、呼び出しの前に呼び出しstartを追加するか、 でバッファリングをオフにします。fflushsleepstdoutsetvbuf

ブロック デバイスまたはディスク ファイルへのストリーム出力は、デフォルトで完全にバッファリングされます。これは、バッファがオーバーフローするか、fflush. これは、たとえば、出力をリアルタイムで監視したい場合など、ファイルに問題がある可能性があります。tail -f. この監視が行われることがわかっている場合は、ストリームを行バッファリングに切り替えて、改行が出力されるたびにバッファがファイルにフラッシュされるようにすることができます。これは、改行が出力されるときにディスク ブロックが数回書き込まれるため、オーバーヘッドが増加するという代償を伴います。(注: このオーバーヘッドは、ファイル システムのマウント方法によって異なります。固定ドライブ、マウントされたライトバック キャッシュは、OS バッファーがディスクに書き込むため、ライトスルー マウントされたリムーバブル ドライブと比べてオーバーヘッドが少なくなります。後者では、この場合、OS は部分的な書き込みを試みて、マウントを解除せずにドライブを取り外した場合にデータの損失を回避できる可能性を高めます。)

于 2013-10-16T05:02:12.143 に答える