Linux緩衝輸出問題

來源:互聯網
上載者:User

Linux緩衝輸出問題 在網上看到一段這樣的代碼,這段代碼本身是有問題的,我看了一下,覺得沒什麼問題,結果編譯運行一下  www.2cto.com  確實報錯,查了一下linux下緩衝方面的資料,跟大家分享一下,最後說下這段代碼的問題所在 當一個程式運行輸出時,是否有必要將輸出立即展示給使用者?這個問題根據使用者需要而定 舉個例子:    假設一個程式輸出到終端,向終端使用者提問,要求使用者回答;或者向使用者給出提示,即讓使用者指定應該鍵入什麼內容,這時候,程式的輸出應該立即展示給使用者。  www.2cto.com      另一種情況是,程式輸出到一個檔案,那麼只要程式結束前最後的結果全部輸出到了檔案就可以了。綜上,程式輸出有兩種方式:一種是立即處理方式,另一種是先緩衝起來,然後再大批寫入的方式,也就是我們所說的緩衝方式。比較一下兩種方式的優缺點。立即方式往往會造成較高的系統負擔,因為磁碟IO一般比較慢;緩衝方式允許我們將資料寫入檔案或磁碟之前先將要寫入的內容儲存到一個緩衝區然後待緩衝區溢位再一次將緩衝區的內容寫入檔案,這樣減少了磁碟IO的次數,提高的系統的效率。 那麼緩衝區該設定多大呢?C語言實現允許程式員控制產生的輸出資料量,也就是可以自訂緩衝區的大小,是通過函數setbuf()實現的。例如下面程式碼片段中的setbuf(stdout,buf)就是將要寫入標準輸出的內容緩衝到buf中,待buf溢出再寫入stdout的,然後清空buf,如此迴圈直至結束。 #include <stdio.h> main(){int c;char buf[BUFSIZ];setbuf(stdout, buf);       while((c=getchar())!=EOF)            putchar(c);} 這段斷碼的問題在哪兒呢?每次緩衝區溢位時將緩衝區的內容寫入到檔案,然後清除緩衝區,那麼最後一次清除緩衝區發生在什麼時間?答案是main()函數返回之後,main函數返回程式不是立即結束,程式把控制權交回作業系統之前c執行階段程式庫必須進行清理工作,而緩衝區buf的清理就發生在此時。因為buf是定義在main中的局部變數,清理buf時,main()函數已經返回了,自然找不到buf了,所以程式出錯。這也是c語言容易出錯的地方。 解決辦法有兩個:            1. 把buf聲明為static類型,及全域型:static char buf[BUFSIZ]#include <stdio.h> main(){int c;static char buf[BUFSIZ];setbuf(stdout, buf);       while((c=getchar())!=EOF)            putchar(c);}            2.用malloc函數動態分配buf的記憶體空間:setbuf(stdout, malloc(BUFSIZ)),不用擔心malloc函數分配記憶體失敗,malloc失敗會            返回NULL,這時會關閉緩衝,linux下有三種緩衝方式:行緩衝,全緩衝,無緩衝#include <stdio.h>#include <stdlib.h> main(){int c;char buf[BUFSIZ];setbuf(stdout, malloc(BUFSIZ));       while((c=getchar())!=EOF)            putchar(c);} 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.