使用setvbuf更改printf的默認buffer 行爲

    有3種buffer行爲,“不緩衝”,“基於塊的緩衝”和“基於行的緩衝”。stdout(printf)默認是基於行的緩衝,即寫到stdout的字符都會被緩衝起來直到一個換行符輸出的時候,這些字符纔會被打印出來;標準錯誤輸出stderr默認是不緩衝的,即寫到stderr的字符會馬上被打印出來。

    下面的例子每隔1S,用printf輸出一個“Hello World!”字符串:

#include <stdio.h>
#include <unistd.h>

int main(void)
{
    while (1) {
        printf("Hello World!");
        sleep(1);
    }
    return 0;
}

實際運行的結果是很長一段時間內BUFSIZ沒有被填滿前,沒有任何輸出。前面提到stdout(printf)是“基於行的緩衝”,我們在“Hello World!”後加一個換行“\n”試試。

#include <stdio.h>
#include <unistd.h>

int main(void)
{
    while (1) {
        printf("Hello World!\n");
        sleep(1);
    }
    return 0;
}

運行結果是每隔1S有一個“Hello World!”和換行輸出,如下:

Hello World!
Hello World!
Hello World!
Hello World!

    下面嘗試通過int setvbuf(FILE *stream, char *buf, int mode, size_t size); 更改stdout的默認緩衝行爲,將line buffered修改爲unbuffered。

#include <stdio.h>
#include <unistd.h>

int main(void)
{
    setvbuf(stdout, NULL, _IONBF, 0);
    while (1) {
        printf("Hello World!");
        sleep(1);
    }
    return 0;
}

運行結果是每隔1S有一個“Hello World!”輸出,如下:

Hello World!Hello World!Hello World!Hello World!Hello World!Hello World!

    基於stdout和stderr的緩衝行爲,如果我們在調試問題打印輸出的時候想馬上看到輸出結果,可以將stdout的line buffered修改爲unbuffered,或者使用fprintf(stderr, ...)。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章