緩沖區(qū) 作用:在實際編程中,I/O速度取決于顯示器、鍵盤、硬盤等I/O設備的性能,而這些設備比起CPU和內(nèi)存是比較慢的。因此系統(tǒng)采用緩沖區(qū)的方式來減少I/O的讀寫,以便提高系統(tǒng)性能。 I/O的緩沖區(qū)的種類:1、無緩沖;2、行緩沖;3、全緩沖。 一、行緩沖: 看一個例子:
結(jié)果:
這段代碼只輸出了“123\n”而沒有輸出“456”。原因是標準I/O:stdin,stdout是行緩沖。 行緩沖的特性是:C標準輸出先寫到行緩沖區(qū)里,當遇到下列四種情況才一次性把行緩沖區(qū)的數(shù)據(jù)寫到I/O設備里去: 1、遇到\n字符; 2、行緩沖區(qū)(linux默認大小為1024字節(jié))被填滿后。 3、調(diào)用沖洗緩沖區(qū)的函數(shù):fflush等。 4、進程返回、調(diào)用exit退出、文件流關(guān)閉等。 上例中printf的作用是把"123\n456"依次寫入緩沖區(qū),由于中途遇到\n,因此立即會把緩沖區(qū)里的所有數(shù)據(jù)——"123\n"寫入I/O設備(此處是屏幕),接著的是把“456”寫到緩沖區(qū)里?!?56”之后沒有“\n”、緩沖區(qū)又沒有滿、程序死循環(huán)在while(1)里沒有結(jié)束,因此“456”將永遠不會輸出到I/O設備里。 屬于行緩沖的I/O設備通常是需要交互的I/O:鍵盤(默認的stdin),屏幕(默認的stdout)等。 二、全緩沖 還是上面的代碼(假設生成的執(zhí)行程序名為“a.ex”,并且目錄下有個“b.txt”的文本),如果這樣啟動:
那么程序?qū)⒉粫敵鋈魏巫址絙.txt中。 因為對于文件(文件是在硬盤上的),硬盤I/O屬于全緩沖。 全緩沖的特性是:C標準輸出先寫到全緩沖區(qū)里,當遇到下列三種情況才一次性把全緩沖區(qū)的數(shù)據(jù)寫到I/O設備里去: 1、全緩沖區(qū)被填滿后。 2、調(diào)用沖洗緩沖區(qū)的函數(shù):fflush等。 3、進程返回、調(diào)用exit退出、文件流關(guān)閉等。 上例中啟動a.ex程序時,用重定向符號“>”將stdout重定向到b.txt里。由于b.txt是文件,屬于硬盤I/O,所以并滿足全緩沖的寫入條件。 屬于全緩沖的I/O設備有:硬盤等。
三、無緩沖
結(jié)果是:
沒錯,無緩沖會直接將字符串寫入I/O設備里去。 write寫文件或者屏幕等設備都是無緩沖的;stderr無論重定向到哪里都是無緩沖的。
四、最后補充一些注意:
結(jié)果是:
因為unix系統(tǒng)中_exit 函數(shù)并不沖洗緩沖區(qū)。 |
|