概述

?內核空間與外圍設備交換資料,用戶空間與內核空間交換資料實際上是非常消耗時間的,應該盡量減少它們之間相互訪問的次數,就應用了緩沖技術,其本質就是一次性讀取大量資料(順序讀寫)進緩沖,當需要資料的時候進入緩沖區讀取資料,這樣能夠大大減少消耗的時候被消耗的時間,所以內核緩沖技術對于檔案IO是非常重要的,

?linux中的fopen函式是open函式的封裝,fopen使用了FILE結構體保存緩沖資料,在進行read和write的時候減少了用戶態和內核態的切換,open沒有緩沖,每次讀操作都直接從檔案系統中獲取資料,在進行read和write的時候每次都需要進行內核態和用戶態的切換,當順序訪問檔案,fopen系列的函式要比直接呼叫open系列快;如果隨機訪問檔案open要比fopen快,
?在上圖中可以看到open每次打開檔案都會產生一個結構體file來保存檔案的讀寫資訊,即使對于同時打開同一個檔案,其結構體資訊是不一樣的,
標準IO緩沖區
?1.不緩沖:一旦有資料,立即同步到外部設備,
?2.全緩沖:(普通檔案的默認型別);
??a.一旦資料填滿了緩沖區,立即同步到外部設備;
??b.程式正常退出時,立即同步到外部設備;
??c.遇到 fflush() 強制同步時,立即同步到外部設備;
??d.關閉檔案時,立即同步到外部設備;
??e.讀取檔案時 , 立即同步到外部設備;
?3.行緩沖:(最多只能緩沖一行)
??a.一旦填滿,立即同步到外部設備;
??b.程式正常退出時,立即同步到外部設備;
??c.遇到 fflush() 強制同步時,立即同步到外部設備;
??d.關閉檔案時,立即同步到外部設備;
??e.讀取檔案時 , 立即同步到外部設備;
??f.一旦遇到 '\n' 時, 立即同步到外部設備;
相關API
setbuf ( 設定檔案流的緩沖區 )
頭檔案:
#include <stdio.h>
定義函式:
void setbuf(FILE * stream, char * buf);
引數分析:
stream --> 為指定的檔案流
buf --> 自定的緩沖區起始地址
無回傳
setvbuf ( 設定檔案流的緩沖區)
頭檔案:
#include <stdio.h>
定義函式:
int setvbuf(FILE * stream, char * buf, int mode, size_t size);
引數分析:
stream --> 指定的檔案流
buf --> 指向自定的緩沖區起始地址
size --> 為緩沖區大小
mode --> 有下列幾種
_IONBF 無緩沖 IO
_IOLBF 以換行為依據的無緩沖 IO
_IOFBF 完全無緩沖 IO. 如果引數 buf 為 NULL 指標, 則為無緩沖 IO.
回傳值:
成功回傳 0
失敗回傳 非零 , 錯誤號碼會被設定
使用代碼
#include <stdio.h>
#include <unistd.h>
#include <string.h>
int main()
{
char buff[1024];
memset( buff, '\0', sizeof( buff ));
fprintf(stdout, "啟用全緩沖\n");
setvbuf(stdout, buff, _IOFBF, 1024);
fprintf(stdout, "這里是 runoob.com\n");
fprintf(stdout, "該輸出將保存到 buff\n");
fflush( stdout );
fprintf(stdout, "這將在程式退出時出現\n");
fprintf(stdout, "最后休眠五秒鐘\n");
sleep(5);
return(0);
}
https://www.runoob.com/cprogramming/c-function-setvbuf.html
總結
?1.通常磁盤上的檔案是全緩沖區的;
?2.標準輸入和標準輸入在指向終端設備時是行緩沖,而指向檔案時,則是全緩沖的;
?3.為了盡可能顯示錯誤資訊,標準錯誤是不帶緩沖的,
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/236874.html
標籤:其他
