乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      關(guān)于I/O緩沖區(qū)

       魚之雨 2014-12-11

      緩沖區(qū)

      作用:在實際編程中,I/O速度取決于顯示器、鍵盤、硬盤等I/O設備的性能,而這些設備比起CPU和內(nèi)存是比較慢的。因此系統(tǒng)采用緩沖區(qū)的方式來減少I/O的讀寫,以便提高系統(tǒng)性能。

      I/O的緩沖區(qū)的種類:1、無緩沖;2、行緩沖;3、全緩沖。

      一、行緩沖:

      看一個例子:

      1. #include <stdio.h>  
      2.   
      3. int main(void)  
      4. {  
      5.     printf("123\n456");  
      6.     while(1){}  
      7.     return 0;  
      8. }  

      結(jié)果:

      1. 123  
      2.    

      這段代碼只輸出了“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”的文本),如果這樣啟動:

      1. $ 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設備有:硬盤等。

      三、無緩沖

      1. #include <stdio.h>  
      2. #include <unistd.h>  
      3. int main(void)  
      4. {  
      5.     write(STDOUT_FILENO,"123\n456",7);  
      6.     while(1){}  
      7.     return 0;  
      8. }  

      結(jié)果是:

      1. 123  
      2. 456  

      沒錯,無緩沖會直接將字符串寫入I/O設備里去。

      write寫文件或者屏幕等設備都是無緩沖的;stderr無論重定向到哪里都是無緩沖的。


      四、最后補充一些注意:

      1. #include <unistd.h>  
      2. #include <stdio.h>  
      3. int main(void)  
      4. {  
      5.     printf("123\n456");  
      6.     _exit(0);  
      7. }  

      結(jié)果是:

      1. 123  
      2.    

      因為unix系統(tǒng)中_exit 函數(shù)并不沖洗緩沖區(qū)。

        本站是提供個人知識管理的網(wǎng)絡存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
        轉(zhuǎn)藏 分享 獻花(0

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多