setvbufを使用してprintfのデフォルトbuffer動作を変更する

1466 ワード

buffer動作には、「バッファリングしない」、「ブロックベースのバッファリング」、「ローベースのバッファリング」の3つがあります.stdout(printf)のデフォルトは行ベースのバッファリングです.つまり、stdoutに書かれた文字は改行文字が出力されるまでバッファリングされます.標準エラー出力stderrはデフォルトではバッファリングされません.つまり、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,...)を使用したりすることができます.