刷新緩存區方式和刷新內存到磁盤方式總結。

  首先聊這個話題,咱們先了解兩個函數:shell

  1.printf函數編程

  2.write函數緩存

  

  .首先了解緩衝區的概念,Linux下的緩衝區分爲如下三種:函數

  1.全緩衝,顧名思義,除非你主動刷新緩衝區,否則只能等到緩衝區滿,才能刷新緩衝區。好比寫入磁盤。spa

  2.行緩衝,當遇到'\n'時,刷新緩衝區,好比 C庫函數。操作系統

  3.無緩衝,接受多少給多少,好比stderr。3d

 

  今天主要講述的是行緩衝,若是想在不使用'\n'的狀況下刷新緩存區,有下列手段——code

  1.fflush()函數。blog

  函數原型:int fflush(FILE *stream),在這裏的stream就是所要清除緩存區的文件。隊列

  舉個很簡單的例子,我想模擬實現一個shell界面就會用以下方式:

printf("Myshell$[");
fflush(stdout):

  

  2.getchar()和scanf()函數。

  當我想要使用鍵盤與屏幕終端時,printf也會主動刷新緩衝區。

  好比:

  

  在暫停下,輸出毫無反應。

  若是我加入getchar,則會出現以下狀況:

  

  屏幕終端在等待個人鍵盤輸入。同時他也刷新了輸出緩衝區。

  須要說明的是,千萬不要認爲輸入輸出是同一塊緩衝區,雖然可能有該系統存在,可是Linux下並非這樣的。

  

  3.setbuf()函數。

  函數原型:void setbuf(FILE* stream, char *buf);

  該函數做用就是關閉緩存區並將緩存區指向buf區域。

  看下列代碼:

  

int main(void)
{
    setbuf(stdout,NULL);
    printf("hello");

    sleep(15);
    return 0;
}

 

  

  能夠看到 在sleep過程當中,也就是進程還沒結束的時候,stdout緩衝區關閉且無跳轉,因此直接輸出。

 

  二.接下來再瞭解刷新內存內容到磁盤的幾大方式:

  write()函數,它與read不一樣,read是直接系統調用將磁盤中的內容讀到內存中。而write僅僅只是將內存中的東西寫到磁盤文件的緩衝區中,至於什麼時候將這些內容放入磁盤,得看操做系統的心情——CPU的調度,隊列的優先級都是關鍵。

  固然也會有以下狀況,咱們意圖當即將內容刷新至磁盤,由於可能如今在一個多用戶條件下,磁盤內容極有可能立刻要被別人獲取。

  如下狀況會當即刷新數據到磁盤:

  1.exit函數,而非_exit函數,

  exit函數的主要步驟有下面三項:

    1.調用退出處理函數。

    2.刷新輸出緩存。

    3.調用_exit函數。

   

  2.return時。

  這個不用解釋,當進程結束,PCB回收,固然會釋放文件描述符表中的文件。

 

  3.緩存區滿。

 

  4.fsync()函數。

  函數原型:int fsync(int fd);//成功返回0,出錯返回-1.

  《UNIX高級環境編程》以下簡單描述:

  

相關文章
相關標籤/搜索