NAME

stdin, stdout, stderr標準 I/O 流

SYNOPSIS 總覽

#include <stdio.h> extern FILE *stdin; extern FILE *stdout; extern FILE *stderr;

DESCRIPTION 描述

通常,每個 Unix 程式在啟動時都會開啟三個流,一個用於輸入,一個用於輸出,一個用於列印診斷或錯誤訊息。典型的,他們被連線到使用者的終端 (參見 tty(4)) 但是也有可能指向檔案或是其他裝置,取決於父程序選擇設定了什麼 (參見 sh(1) 的重定向 (``Redirection'') 章節。)
輸入流被稱為 ``standard input''; 輸出流被稱為 ``standard output''; 錯誤流被稱為 ``standard error''。這些名詞通常簡寫為符號,用於引用這些檔案,它們是 stdin, stdout, 和 stderr.
這些符號中,每一個都是 stdio(3) 中的一個宏,型別是指向 FILE 的指標,可以用於類似 fprintf(3)fread(3) 等函式中。
由於 FILE 是一個對 Unix 檔案描述符加以緩衝的包裝,下層的檔案也可以使用原始的 Unix 檔案介面來存取。也就是,類似 read(2)lseek(2) 的函式。與流 stdin, stdout, 和 stderr 關聯的整數形式的檔案描述符分別是 0,1 還有 2。預處理器符號 STDIN_FILENO,STDOUT_FILENO 和 STDERR_FILENO 分別以它們為值,定義在 <unistd.h> 中。
注意混合使用 FILE 和原始的檔案描述符可能帶來不可預料的結果,一般應當避免。(對於喜歡追根問底的人:POSIX.1 規範的 8.2.3 節詳細地描述了這樣的混合使用怎樣才能不出錯。) 一個簡單的規則是,檔案描述符由核心控制,而 stdio 僅僅是一個庫。它的意思是,例如當呼叫 exec 之後,子程序可以繼承所有開啟的檔案描述符,但是任何原有的流都不可再存取了。
由於符號 stdin, stdout, 和 stderr 被指定為宏,為它們賦值將導致不可移植。利用庫函式 freopen(3) ,標準流可以用來指向不同的檔案。引進這個函式專門用來為 stdin, stdout, 和 stderr 重新賦值。標準流在呼叫 exit(3) 和程式正常中止時被關閉。

SEE ALSO 參見

sh(1), csh(1), open(2), fopen(3), stdio(3)

CONSIDERATIONS

錯誤流 stderr 是非緩衝的。輸出流 stdout 是行緩衝的,如果它指向一個終端。不完全的行只有在呼叫 fflush(3)exit(3) ,或者列印了新行符之後才會顯示。這樣可能帶來無法預料的結果,尤其是除錯輸出時。標準流 (或任何其他流) 的緩衝模式可以用函式 setbuf(3)setvbuf(3) 來切換。注意當 stdin 與一個終端關聯時,也許終端驅動中存在輸入緩衝,與 stdio 緩衝完全無關。(確實如此,一般的終端輸入在核心中是行緩衝的。) 核心對輸入的控制可以透過對 tcsetattr(3) 的呼叫來修改,參見 stty(1), 和 termios(3)

CONFORMING TO 標準參考

stdin, stdout, 和 stderr 遵循 ANSI X3.159-1989 (“ANSI C89”) 標準,這個標準同時規定了這三個流應當在程式啟動時開啟。

本頁面中文版由中文 man 手冊頁計劃提供。
 
中文 man 手冊頁計劃: https://github.com/man-pages-zh/manpages-zh