|  | |
| 標準I/O操作的緩沖存儲類型 | |
| 前面幾篇文(wen)章所述的文(wen)件及I/O讀寫都(dou)是基(ji)于文(wen)件描述符(fu)的。這(zhe)(zhe)些都(dou)是基(ji)本的I/O控制,是不帶緩存的。而本節所要討論(lun)的I/O操(cao)作都(dou)是基(ji)于流(liu)緩沖的,它是符(fu)合ANSI C的標(biao)準I/O處理(li),這(zhe)(zhe)里有很多函(han)數讀者已(yi)經(jing)非常(chang)熟悉了(如printf()、scantf()函(han)數等),因此本節僅簡(jian)要介紹主要的函(han)數。 前面講述的系統調用是操(cao)作系統直(zhi)接提供的函數接口。因為運行(xing)系統調(diao)用(yong)(yong)時,Linux必須從用(yong)(yong)戶態(tai)切換到內核態(tai),執行(xing)相應(ying)的請求,然后再返回用(yong)(yong)戶態(tai),所以應(ying)該盡量減少系統調(diao)用(yong)(yong)的次數,從而提高(gao)程序的效率。   標準(zhun)I/O提供(gong)流緩沖的(de)(de)(de)目的(de)(de)(de)是盡(jin)可能減少使用read()和write()等系統調用的(de)(de)(de)數量。標準(zhun)I/O提供(gong)了3種類型(xing)的(de)(de)(de)緩沖存儲。 1、全(quan)緩(huan)(huan)(huan)沖(chong):在(zai)這種(zhong)情(qing)況下,當(dang)填滿標(biao)準(zhun)I/O緩(huan)(huan)(huan)存后才進(jin)行(xing)實(shi)際I/O操作(zuo)。對于存放在(zai)磁盤(pan)上的(de)文(wen)件通常是由標(biao)準(zhun)I/O庫實(shi)施(shi)全(quan)緩(huan)(huan)(huan)沖(chong)的(de)。標(biao)準(zhun)I/O盡量多(duo)讀寫文(wen)件到緩(huan)(huan)(huan)沖(chong)區(qu),當(dang)緩(huan)(huan)(huan)沖(chong)區(qu)已(yi)滿或手動刷新時才會進(jin)行(xing)磁盤(pan)操作(zuo)。 2、行(xing)緩沖(chong):在(zai)這種情況下,當在(zai)輸入和(he)輸出(chu)中遇到(dao)行(xing)結(jie)束(shu)符時,標(biao)準(zhun)I/O庫執行(xing)I/O操作(zuo)。這允許一次輸出(chu)一個(ge)字符(如fputc()函數(shu)),但(dan)只有寫了(le)一行(xing)后才進行(xing)實(shi)際I/O操作(zuo)。標(biao)準(zhun)輸入和(he)標(biao)準(zhun)輸出(chu)就是使用(yong)行(xing)緩沖(chong)的典型例子。 3、不(bu)帶緩(huan)沖(chong):標準(zhun)I/O庫不(bu)對字(zi)符進行緩(huan)沖(chong)。如果用標準(zhun)I/O函數(shu)寫(xie)若干字(zi)符到不(bu)帶緩(huan)沖(chong)的(de)(de)流(liu)中,則(ze)相(xiang)當(dang)于用系(xi)統調(diao)用write()函數(shu)將這些字(zi)符全寫(xie)到被打開的(de)(de)文件上。標準(zhun)出錯(cuo)(cuo)stderr通常是不(bu)帶緩(huan)存的(de)(de),這就使(shi)得出錯(cuo)(cuo)信息可以盡快(kuai)顯示出來,而(er)不(bu)管它(ta)們(men)是否含有一(yi)個行結束符。 在下面討論具體函(han)數(shu)時,請讀(du)者注意(yi)區分以(yi)上(shang)3種不同情況。 本文選自華清遠見嵌入式培訓教材《從實踐中學嵌入式Linux應用程序開發》 熱點鏈接:       
         1、Linux下多路復用I/O接口 |