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