stdin,
stdout,
stderr —
標準 I/O 流
#include
<stdio.h>
extern FILE *stdin;
extern FILE *stdout;
extern FILE *stderr;
通常,每個 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)
和程式正常中止時被關閉。
sh(1),
csh(1),
open(2),
fopen(3),
stdio(3)
錯誤流
stderr
是非緩衝的。輸出流
stdout
是行緩衝的,如果它指向一個終端。不完全的行只有在呼叫
fflush(3) 或
exit(3)
,或者列印了新行符之後才會顯示。這樣可能帶來無法預料的結果,尤其是除錯輸出時。標準流
(或任何其他流)
的緩衝模式可以用函式
setbuf(3) 或
setvbuf(3)
來切換。注意當
stdin
與一個終端關聯時,也許終端驅動中存在輸入緩衝,與
stdio
緩衝完全無關。(確實如此,一般的終端輸入在核心中是行緩衝的。)
核心對輸入的控制可以透過對
tcsetattr(3)
的呼叫來修改,參見
stty(1), 和
termios(3) 。
宏
stdin,
stdout, 和
stderr 遵循
ANSI X3.159-1989
(“ANSI C89”)
標準,這個標準同時規定了這三個流應當在程式啟動時開啟。
本頁面中文版由中文 man
手冊頁計劃提供。
中文 man 手冊頁計劃:
https://github.com/man-pages-zh/manpages-zh