setvbufを使用してprintfのデフォルトbuffer動作を変更する
1466 ワード
buffer動作には、「バッファリングしない」、「ブロックベースのバッファリング」、「ローベースのバッファリング」の3つがあります.stdout(printf)のデフォルトは行ベースのバッファリングです.つまり、stdoutに書かれた文字は改行文字が出力されるまでバッファリングされます.標準エラー出力stderrはデフォルトではバッファリングされません.つまり、stderrに書かれた文字がすぐに印刷されます.
次の例は1 Sおきにprintfで「Hello World!」を出力します.文字列:
実際の運用の結果、BUFSIZは長い間埋まっておらず、何の出力もありませんでした.前述したstdout(printf)は「行ベースのバッファリング」であり、「Hello World!」あとで改行「」を付けてみます.
実行結果は1 Sごとに「ハローワールド!を選択して、次のようにします.
Hello World! Hello World! Hello World! Hello World!
次にint setvbuf(FILE*stream,char*buf,int mode,size_t size)を試します.stdoutのデフォルトのバッファ動作を変更し、line bufferedをunbufferedに変更します.
実行結果は1 Sごとに「ハローワールド!出力:
Hello World!Hello World!Hello World!Hello World!Hello World!Hello World!
stdoutとstderrのバッファ動作に基づいて、問題の印刷出力をデバッグするときに出力結果をすぐに見たい場合は、stdoutのline bufferedをunbufferedに変更したり、fprintf(stderr,...)を使用したりすることができます.
次の例は1 Sおきにprintfで「Hello World!」を出力します.文字列:
#include
#include
int main(void)
{
while (1) {
printf("Hello World!");
sleep(1);
}
return 0;
}
実際の運用の結果、BUFSIZは長い間埋まっておらず、何の出力もありませんでした.前述したstdout(printf)は「行ベースのバッファリング」であり、「Hello World!」あとで改行「」を付けてみます.
#include
#include
int main(void)
{
while (1) {
printf("Hello World!
");
sleep(1);
}
return 0;
}
実行結果は1 Sごとに「ハローワールド!を選択して、次のようにします.
Hello World! Hello World! Hello World! Hello World!
次にint setvbuf(FILE*stream,char*buf,int mode,size_t size)を試します.stdoutのデフォルトのバッファ動作を変更し、line bufferedをunbufferedに変更します.
#include
#include
int main(void)
{
setvbuf(stdout, NULL, _IONBF, 0);
while (1) {
printf("Hello World!");
sleep(1);
}
return 0;
}
実行結果は1 Sごとに「ハローワールド!出力:
Hello World!Hello World!Hello World!Hello World!Hello World!Hello World!
stdoutとstderrのバッファ動作に基づいて、問題の印刷出力をデバッグするときに出力結果をすぐに見たい場合は、stdoutのline bufferedをunbufferedに変更したり、fprintf(stderr,...)を使用したりすることができます.