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
Linux 2.0 March 24, 1998 Linux 2.0