[英]Why is stdout buffering?
我正在嘗試學習libuv
api並編寫以下測試:
#include <stdio.h>
#include <stdlib.h>
#include <uv.h>
void timer_cb(uv_timer_t* timer) {
int* i = timer->data;
--*i;
if(*i == 0) {
uv_timer_stop(timer);
}
printf("timer %d\n", *i);
//fflush(stdout);
}
int main() {
uv_loop_t* loop = uv_default_loop();
uv_timer_t* timer = malloc(sizeof(uv_timer_t));
uv_timer_init(loop, timer);
int i = 5;
timer->data = &i;
uv_timer_start(timer, timer_cb, 1000, 2000);
uv_run(loop, UV_RUN_DEFAULT);
printf("Now quitting.\n");
uv_close(timer, 0);
uv_loop_close(loop);
return 0;
}
運行它時,在程序完成運行之前不會顯示任何輸出,然后立即顯示所有輸出。 如果我取消注釋fflush
線它按預期工作,每2秒寫一次。
有人可以向我解釋一下嗎? 為什么stdout
為解釋不換行后刷新, 在這里和在其他地方? 為什么我需要手動沖洗它?
流緩沖是實現定義的。
按7.21.3文件 , C標准第3段:
當流未緩沖時 ,字符應盡快從源或目的地出現。 否則,可以將字符作為塊累積並發送到主機環境或從主機環境發送。 當流被完全緩沖時 ,當填充緩沖區時,字符將作為塊傳輸到主機環境或從主機環境傳輸。 當流被線緩沖時 ,當遇到換行符時 ,字符將作為塊傳輸到主機環境或從主機環境傳輸。 此外,當填充緩沖區,在無緩沖流上請求輸入時,或者在需要從主機環境傳輸字符的行緩沖流上請求輸入時,字符旨在作為塊傳輸到主機環境。 。 對這些特性的支持是實現定義的 ,可能會受到
setbuf
和setvbuf
函數的影響。
緩沖的類型取決於您的實現,並且您的實現顯然不是您的示例中的行緩沖。
沒有嚴格的要求, stdout
是行緩沖的。 它也可以完全緩沖(或根本不緩沖),在這種情況下\\n
不會觸發刷新流。
C11(N1570)7.21.3 / 7 檔案 :
最初打開時,標准錯誤流未完全緩沖; 當且僅當可以確定流不參考交互設備時,標准輸入和標准輸出流被完全緩沖。
C11(N1570)5.1.2.3/7 程序執行 :
構成交互設備的是實現定義的。
您可以嘗試通過setvbuf
標准函數強制執行特定類型的緩沖。 例如,要為stdout
設置行緩沖,您可以嘗試使用:
setvbuf(stdout, buff, _IOLBF, size);
其中buff
被聲明為size
元素的字符數組(例如1024)。
請注意,必須在對流執行的任何其他I / O操作之前調用setvbuf
。
出於某種原因,您的系統決定您的stdout不是交互式的。 你在做什么奇怪的重定向stdout或做一些奇怪的終端? 您應該能夠使用setbuf覆蓋,或者您可以使用stderr而不是stdout。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.