Scroll to navigation

STDIN(3) Library Functions Manual 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 遵循 ANSI X3.159-1989 (“ANSI C89”) 標準,這個標準同時規定了這三個流應當在程序啓動時打開。

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