歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> 關於Linux >> Linux緩沖輸出問題

Linux緩沖輸出問題

日期:2017/3/1 16:35:37   编辑:關於Linux
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); }
Copyright © Linux教程網 All Rights Reserved