歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux基礎 >> Linux教程

Linux標准IO庫緩存策略介紹

    標准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