標準串流

title: 背景.
content: 在Unix之前的操作系统,程序必须明确指出连结到合适的输入和输出资料。对这当中的许多系统而言,这牵涉一些错综复杂而又与特定操作系统相关的事,是一件吓人的程序设计挑战。如控制环境设定、存取一个档案表格、决定区域资料集、和决定读卡机、磁带、磁盘、打印机、打卡机或交互式终端机。  Unix 提供许多开创产的进步,其中之一是提供 "抽象设备" :它免除了程序须要知道或在意它正与哪个设备沟通。 Unix 借由资料串流的概念来消除这种复杂:一种资料字节的有序序列,直到读到档案结尾。程序员亦可依需求写入而无须宣告写入多少或如何组织。  另一个 Unix 突破为默认自动连结输入和输出-程序(和程序员)不用为了典型"输入-处理-输出"程序建立输入和输出。相对地,之前操作系统通常要求一些-有时复杂-工作控制语言(Job Control Language)以建立连结,或者,相者近似于协调的责任。  既然 Unix 提供标准串流,Unix C 的执行环境被要求要支援它。结果不管什么操作系统, C 的执行环境(及 C 的衍生)都提供类似功能。
title: 标准输入 (stdin).
content: 标准输入是指输入至程序的资料(通常是文件)。程序要求以"读"(read)操作来传输资料。并非所有程序都要求输入。如"dir"或"ls"程序(显示一个目录中的档名)运行时不用任何输入。  除非重导向,输入是预期由 键盘取得的。  标准输入的档案描述子为 0 (零);在POSIX "<unistd.h>" 的定义是 STDIN_FILENO;相对应的 "<stdio.h>" 变量为 FILE* stdin ;类似地, "<iostream>" 变量为 std::cin 。
title: 标准输出 (stdout).
content: 标准输出是指程序写输出资料的串流。程序要求资料传输使用"写"的运算。并非所有程序都要求输出。如"mv"或"ren"程序在成功完成时是沉默的。  除非重导向,输出为 终端。  标准输出的档案描述子为 1 (一)。POSIX "<unistd.h>" 定义是 STDOUT_FILENO;相对应的 "<stdio.h>" 变量为 FILE* stdout ;类似地, "<iostream>" 变量为 std::cout 。
title: 标准错误输出 (stderr).
content: 标准错误输出是另一输出串流,用于输出错误讯息或诊断。它独立于标准输出,且可以分别被重导。常见的目的则为启始这个程序的终端,即使其"标准输出"被重导亦如此。例如:一个管线中的程序的输出被重导到下一个程序,但错误讯息仍然直接流向文字终端机。  把"标准输出"和"标准错误输出"导到相同的目的地,如文字终端,是可以(且正常)的。讯息会以如同程序写入的顺序来出现,除非使用了缓冲。(例如,一个常见状况是,当标准错误串流未使用缓冲,但标准输出串流使用了缓冲;在这种情况下,如果标准输出的缓冲区还没满的话,较迟写到标准错误的文字可能会较早出现在终端。  标准错误输出的档案描述子为 2 ;POSIX "<unistd.h>" 定义为 STDERR_FILENO;相对的 "<stdio.h>" 变量 FILE* stderr。C++ "<iostream>" 标准表头档提供两个相关的变量: std::cerr 和 std::clog,前者用于无缓冲的而后者使用和其它 C++ 串流相同的缓冲机制。  大部分壳程序允许使用 将"标准输出"和"标准错误输出"重导向到相同的档案。  Bourne-类壳程序允许使用 将"标准错误输出"重导向到"标准输出"的目的。
title: 年表.
title: 1950 年代: Fortran.
content: Fortran 提供类于 Unix 档案描述子:codice_1 用于 stdin 、 codice_2 用于 stdout 和 codice_3 用于 stderr 。
title: 1960: ALGOL 60.
content: ALGOL 60因没有标准档案存取而受批评。
title: 1968: ALGOL 68.
content: ALGOL 68 的输入和输出机制合起来称为 transput 。 Cornelis H. A. Koster coordinated the definition of the "transput" standard. 这标准包含:codice_4、codice_5、codice_6和codice_7。  范例:
title: 1970 年代: C 和 Unix.
content: 在 C语言 中,标准输入、标准输出和标准错误输出分别连接到已存的 Unix 档案描述子 0 、1 和 2。
title: 1995: Java.
content: 在Java中, 标准串流被称为 System.in(标准输入)、System.out(标准输出)和 System.err(标准错误)。
title: 2000s:.NET.
content: 在 C# 和其它.NET 语言中,标准串流为 codice_8 (标准输入)、codice_9 (标准输出)和codice_10 (标准错误)。stdin 和 stdout 的基本读写能力可以直接透过 codice_11 来存取(如 codice_12 可以取代 codice_13 )。 注意, codice_8, codice_9 和 codice_10 是 codice_17 (stdin) 和 codice_18 (stdout, stderr) 的对象,只允许存取底层基于文件的标准串流。存取二位元标准串流要分别经由 codice_19, codice_20 和 codice_21 所传回的codice_22。  当使用 codice_23 类时,可以使用 codice_24、codice_25 和 codice_26 属性来存取程序的标准串流。  Console 并非指 Dos 的命令列视窗。
title: 图形使用者接口.
content: 图形使用者接口很少使用标准串流。 重导图形使用者接口或建立管线是不实用的。 最近似的大概是从一个程序"剪下"(或"复制")再贴到另一个。 既然需要人工使用者的运作,移动大量的"贴上"就不会特别有效率。 一个值得一提的例外为dwm铺砖式视窗管理器(tiling window manager),其会将导入标准输入的资料显示到状态列。  一些原本在 Unix 上的图形使用者接口程序仍会写错误讯息到标准错误输出。 其它可能会从标准输入取得档案,如许多 Unix 媒体播放程序。  GTK-Server 可以使用标准输入为沟通接口,以便交互式程序能理解图形使用者接口程序。

Summary: 在Unix和类Unix系统中,如同某些程序语言接口一样,标准串流是当一个计算机程序执行时,在它和它的环境间(典型为终端),事先连接的输入和输出频道。这三个I/O连结称作“标准输入”、“标准输出”和“标准错误输出”。

Standard streams: In computer programming, standard streams are interconnected input and output communication channels between a computer program and its environment when it begins execution. The three input/output (I/O) connections are called standard input (stdin), standard output (stdout) and standard error (stderr). Originally I/O happened via a physically connected system console (input via keyboard, output via monitor), but standard streams abstract this. When a command is executed via an interactive shell, the streams are typically connected to the text terminal on which the shell is running, but can be changed with redirection or a pipeline. More generally, a child process inherits the standard streams of its parent process.