首先聊這個話題,咱們先了解兩個函數: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高級環境編程》以下簡單描述: