fwrite實(shí)現(xiàn)原理:
FILE有三種緩存模式,
1.全緩沖
2.無(wú)緩沖
3.先緩沖
默認(rèn)為全緩沖隘庄,在第一次fwrite數(shù)據(jù)時(shí)會(huì)創(chuàng)建緩沖區(qū),通過(guò)fstat方法,獲取fd對(duì)應(yīng)的文件系統(tǒng)的block size即st.st_blksize财忽,如果為空,則使用默認(rèn)的BUFSIZ==1024泣侮。
實(shí)際測(cè)試block size即彪,
Linux 文件系統(tǒng)的block size為4196。
小tf卡的block size為8192
U盤(pán)block size為8192活尊,sd卡通過(guò)讀卡器掛載隶校,block size為16384
全緩沖模式
如果C Buffer已經(jīng)臟了一部分,就先拷貝一部分?jǐn)?shù)據(jù)到C緩存蛹锰,填滿C緩存后深胳,調(diào)用write寫(xiě)入數(shù)據(jù),然后判斷剩下數(shù)據(jù)是否大于C buffer的大小铜犬,如果是就直接調(diào)用write舞终。
如果剩下數(shù)據(jù)小于C buffer的緩存,就拷貝進(jìn)去癣猾。
所以正常情況下敛劝,數(shù)據(jù)大小小于C buffer size,就會(huì)循環(huán)填充C Buffer纷宇,填滿之后就調(diào)用write寫(xiě)數(shù)據(jù)夸盟。
無(wú)緩存模式
循環(huán)調(diào)用write寫(xiě)數(shù)據(jù),每次寫(xiě)1024大小數(shù)據(jù)像捶,直到寫(xiě)完
每次寫(xiě)?BUFSIZ大小的數(shù)據(jù)上陕,直到寫(xiě)完桩砰。
fflush實(shí)現(xiàn)原理:
將C Buffer中緩存的數(shù)據(jù)調(diào)用write一次性寫(xiě)入,如果沒(méi)有一次性寫(xiě)完释簿,會(huì)循環(huán)write直到寫(xiě)完五芝。