簡體   English   中英

為什么stdout緩沖?

[英]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段:

當流未緩沖時 ,字符應盡快從源或目的地出現。 否則,可以將字符作為塊累積並發送到主機環境或從主機環境發送。 當流被完全緩沖時 ,當填充緩沖區時,字符將作為塊傳輸到主機環境或從主機環境傳輸。 當流被線緩沖時 ,當遇到換行符時 ,字符將作為塊傳輸到主機環境或從主機環境傳輸。 此外,當填充緩沖區,在無緩沖流上請求輸入時,或者在需要從主機環境傳輸字符的行緩沖流上請求輸入時,字符旨在作為塊傳輸到主機環境。 。 對這些特性的支持是實現定義的 ,可能會受到setbufsetvbuf函數的影響。

緩沖的類型取決於您的實現,並且您的實現顯然不是您的示例中的行緩沖。

沒有嚴格的要求, 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM