參考
1
2
IO操作
fread/fwrite/fflush:
read/write/fsync:
兩者之間的關(guān)系如下:
可以將fread,fwrite是一種批量寫入,而read,write是單次寫入的形式來(lái)理解。
write是系統(tǒng)調(diào)用,每次需要將數(shù)據(jù)寫到磁盤,寫的大小是要求的大小,依然涉及頻繁的用戶態(tài)和內(nèi)核態(tài)切換;
fwrite是庫(kù)函數(shù),每次將數(shù)據(jù)寫入到緩沖區(qū),等緩沖區(qū)滿了,一次寫入磁盤?;蛘呤褂?fflush 沖洗緩沖區(qū);
fflush:是把C庫(kù)中的緩沖調(diào)用write函數(shù)寫到磁盤(其實(shí)是寫到內(nèi)核的緩沖區(qū))。
fsync:是把內(nèi)核緩沖刷到磁盤上。
注意:
(1)fwrite
fwrite每次將數(shù)據(jù)寫入到緩沖區(qū),等緩沖區(qū)滿了,一次寫入磁盤;存在延遲寫入、或?qū)€程訪問(wèn)文件數(shù)據(jù)異常問(wèn)題;為解決該問(wèn)題,可使用fflush()函數(shù),及時(shí)刷新緩存、寫入;
(2)fflush:標(biāo)準(zhǔn)I/O函數(shù)(如:fread,fwrite)會(huì)在內(nèi)存建立緩沖,該函數(shù)刷新內(nèi)存緩沖,將內(nèi)容寫入內(nèi)核緩沖,要想將其寫入磁盤,還需要調(diào)用fsync。(先調(diào)用fflush后調(diào)用fsync,否則不起作用)。
(3)fflush()與fsync()的聯(lián)系:
對(duì)于輸入設(shè)備,調(diào)用fsync/fflush將清空相應(yīng)的緩沖區(qū),其內(nèi)數(shù)據(jù)將被丟棄;對(duì)于輸出設(shè)備或磁盤文件,fflush只能保證數(shù)據(jù)到達(dá)內(nèi)核緩沖區(qū),并不能保證數(shù)據(jù)到達(dá)物理設(shè)備, 因此應(yīng)該在調(diào)用fflush后,調(diào)用fsync(fileno(stream)),確保數(shù)據(jù)存入磁盤。
(4)fdatasync:類似fsync,但它只影響文件的數(shù)據(jù)部分;
fdatasync與fsync的區(qū)別在于fdatasync不會(huì)flush文件的metadata信息;這個(gè)是為了減少對(duì)磁盤的操作;如果以塊為單位知道寫入多少數(shù)據(jù),可以使用fdatasync;
如下:
#include#include#include#includeint main(int argc, char **argv){FILE *fp = fopen("test.txt","w");
char *line ="Test";
char *fill ="\0";
fwrite(fill, 1, 100*strlen(line), fp);
fflush(fp);
fsync(fileno(fp));
rewind(fp);
for (int i = 0; i< 100; i++){fwrite(line, strlen(line), 1, fp);
fflush(fp);
fdatasync(fileno(fp));
}
}
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購(gòu),新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧