標準輸入,標準輸出,標準錯誤輸出緩衝問題

2021-06-01 12:07:45 字數 1592 閱讀 1764

基於流的操作最終會呼叫read或者write函式進行i/o操作。為了使程式的執行效率最高,流物件通常會提供緩衝區,以減少呼叫系統i/o庫函式的次數。

基於流的i/o提供以下3種緩衝:

以上3種緩衝區分別定義為3個巨集,其定義如表21-1所示。

表21-1  緩衝區型別的巨集定義

緩衝區型別

定 義 的 巨集

全緩衝_io_full_buf

行緩衝_io_line_buf

無緩衝_io_unbuffered

在使用上表所述的緩衝型別巨集時,應將檔案流物件中的緩衝區標誌與該巨集做「與」操作,判斷結果是否為0即可知道該緩衝檔案流的緩衝區是否屬於該型別了。下面例項演示了得到檔案流的緩衝區型別。該程式輸出標準輸出、標準輸入和標準出錯3個檔案描述符的緩衝區型別、緩衝區大小等資訊。

程式清單21-1  buf.c 輸出緩衝區的型別和緩衝區大小

#include

int main(void)

(2)在shell中編譯該程式如下:

$gcc buf.c -o buf

(3)在shell中執行該程式如下:

$./buf

stdin is line-buffered

buffer size is 1024

discriptor is 0

stdout is line-buffered

buffer size is 1024

discriptor is 1

stderr is unbuffered

"buffer size is 0

discriptor is 2

(4)使用重定向後執行該程式如下:

$./buf < in.txt 1> out.txt 2> err.txt

stdin is full-buffered

buffer size is 4096

discriptor is 0

stdout is full-buffered

buffer size is 4096

discriptor is 1

stderr is unbuffered

"buffer size is 0

discriptor is 2

說明:由此可知,不論什麼時候,標準出錯都是無緩衝的。這樣可以保證出錯資訊及時地輸出給使用者,供使用者排除錯誤、解決問題。

我在程式中用:

fork()

if(ischildren)

來重定向stdout,發現stdout被緩衝了。子程式中不用fflush就不能立刻返回輸出的內容。

因為子程式不一定是我寫的,所以不能通過子程式來解決。

是不是只能通過管道來解決來?

太遺憾了,如果你的**之後要呼叫exec,而要exec的程式又沒有原始碼,

就沒有辦法通過設定緩衝區來解決這個問題了(因為緩衝區並不在你的程式中)

解決的辦法只有建立乙個偽終端,讓被exec的程式工作在偽終端上,從而按照終端的方式來緩衝,參見<

看了一下,如何竭力偽終端,不太好搞啊。。。決定還是在exec後面的程式輸出後加上fflush(我有原始碼,不過是別人寫的,看來只能改了)。

標準輸入,標準輸出和標準錯誤

當我們使用檔案描述符進行操作時,需要操作標準輸入 標準輸出 標準錯誤,可以包含如下標頭檔案 include這個標頭檔案中定義了標準裝置 standard file descriptors.define stdin fileno 0 standard input.define stdout filen...

重定向》 與標準輸入 標準輸出 標準錯誤輸出

當linux執行乙個程式的時候,會自動開啟三個流,標準輸入 standard input 標準輸出 standard output 標準錯誤輸出 standard error 比如在開啟命令行時,預設情況下,命令列的標準輸入連線到鍵盤,標準輸出和標準錯誤都連線到螢幕,儘管三個流都開啟,但他會根據需要...

標準輸入標準輸出標準錯誤重定向

重定向操作符 描述 將命令輸出寫入到檔案或裝置 如印表機 而不是命令提示符視窗或控制代碼。從檔案而不是從鍵盤或控制代碼讀入命令輸入。將命令輸出新增到檔案末尾而不刪除檔案中已有的資訊。將乙個控制代碼的輸出寫入到另乙個控制代碼的輸入中。從乙個控制代碼讀取輸入並將其寫入到另乙個控制代碼輸出中。從乙個命令中...