歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> Linux標准IO庫緩存策略介紹

Linux標准IO庫緩存策略介紹

日期:2017/2/28 16:15:20   编辑:Linux教程
標准IO庫操作是圍繞著流來進行的,當我們通過fopen標准IO庫函數打開一個文件,我們就使一個文件和一個IO流相關聯。在這裡我們把IO流和文件指針FILE*等同起來,因為所有針對IO流的操作都是通過FILE*指針來實現的。

我們知道引入標准IO庫的目的是為了提高IO的效率,避免頻繁的進行read/write系統調用,而系統調用會消耗較多的資源。因此標准IO庫引入了IO緩存,通過累積一定量的IO數據後,然後集中寫入到實際的文件中來減少系統調用,從而提高IO效率。標准IO庫會自動管理內部的緩存,不需要程序員介入。然而,也正是因為我們看不到標准IO庫的緩存,有時候會給我們帶來一定的迷惑性。這裡介紹下標准IO庫的緩存策略。

一。標准I/O的緩存--標准輸出為例:(這裡都是指缺省情況下)

1)當STDOUT連接到終端設備時,那麼它就是行緩存的,也就是標准IO庫沒看到一個新行符 \n時就刷新一次緩存(即執行一次實際的輸出操作)。這一特性可以通過如下測試代碼來驗證

int main()
{
printf("This Line Should be Cached...");
sleep(3); //這時候在終端上是看不到任何輸出
printf("\nThis Line Should be Cached Again"); //這時候可以看到第一個printf的輸出,因為被換行符刷新了
sleep(3); //這時候也只能看到一行輸出,而看不到第二個printf輸出的
printf("This Line Should Not be Cached Again\n"); //這時候可以看到第二個和第三個printf的輸出,因為被結尾的\n刷新
sleep(3);
getchar();
}

2)當STDOUT被重定向到一個具體文件時,那麼標准輸出是全緩存的,也就是說只有當輸出緩存被塞滿或者調用fflush或fclose時才會執行實際的寫入操作,這裡就不給出具體例子,可以通過freopen將STDOUT重定向到一個具體文件來進行測試。

二。標准出錯STDERR:為了盡快的看到出錯信息,標准出錯是不帶任何緩存的

Copyright © Linux教程網 All Rights Reserved