STDIN(3)

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 遵循 ansiC 標準，這個標準同時規定了這三個流應當在程式啟動時打開。