概述
标准I/O流以及其发展
标准输入流
标准输出流
标准错误流
在程序设计中,当计算机程序开始执行时,标准流是指计算机程序与其运行环境之间预先连接的输入和输出通信信道。
三个输入/输出(I/O)连接的通道分别为标准输入(stdin)、标准输出(stdout)和标准错误(stderr)。
最初的时候,I/O是通过物理连接系统控制台的方式实现的,也就是说我要通过键盘进行输入,然后通过监视器进行输出,但是标准流很好地抽象了这一点。
当我们通过交互shell执行命令时,标准流通常连接到运行shell的文本终端,但可以通过重定向(redirection)或管道(pipeline)进行更改。
子进程一般继承其父进程的标准流。
我们知道标准流是处理来自输入设备或从应用程序写入数据的输入和输出通道。
数据可以是带有任何编码的文本,也可以是二进制数据。
在许多现代的操作系统中,程序的标准错误流(stderr)被重定向到日志文件中,通常用于错误分析。
标准流可以用于链接应用程序,这意味着一个程序的输出流可以重定向为另一个应用程序的输入流,这点我们用过Linux就会有所了解,当我们使用时使用时,应用程序名称由垂直条字符分隔,因此通常称为管道字符(pipeline character)。
在大多数早于Unix的操作系统中,程序必须显式地连接到适当的输入和输出设备。例如,在许多系统中,需要获得对环境设置的控制,访问本地文件表,确定预期的数据集,并在穿孔卡读卡器、磁带驱动器、磁盘驱动器、行式打印机、卡片穿孔或交互终端的情况下正确处理硬件。
而Unix系统的几个突破性进展之一是抽象设备,我们写程序的时候不再需要知道或关心与我们的程序进行通信的设备种类。
Unix通过数据流的概念消除了我们写程序时要做的很多复杂的事情。
Unix的另一个突破是自动将输入和输出分别关联到终端键盘和终端显示,默认情况下我们写的程序完全没有必要去为典型的输入过程输出程序建立输入和输出(特殊的需求除外)
但是在很早以前(还没有Unix的时候),我们写的程序通常需要一些复杂的作业控制语言来建立连接。
正式由于Unix提供了标准流,因此UnixC运行时环境也必须支持它。因此,无论操作系统如何,大多数C运行时环境(还有C++)都提供同等的功能。
标准输入是进入到我们写的程序的流数据(通常是文本)。程序使用读取操作请求数据传输。当然并不是所有程序都需要流输入,比如做一下1+1等于几,当然不需要标准流输入输出啦。
除非使用重定向,否则标准输入将从父进程继承。在交互shell的情况下,标准输入通常与键盘关联。标准输入的文件描述符为0;
标准输出是我们写的程序中写入到输出数据的流。程序通过写操作请求数据传输。当然,也并非所有程序都生成输出。
除非重定向,否则标准输出也是将从父进程继承。在交互shell的情况下,通常是启动程序的文本终端。标准输出的文件描述符为1;
标准错误是我们写的程序中用来输出错误消息或诊断的另一个输出流。
注意标准错误流是独立于标准输出的,也可以单独地进行重定向。标准错误流一般也是在文本终端输出,即使标准输出被重定向了。
例如,管道中程序的输出被重定向到下一个程序的输入,但每个程序的错误仍然直接进入文本终端。
将标准输出和标准误差引导到同一目的地(如文本终端)也是可以的。消息的出现顺序与我们的程序中将它们写入的顺序相同,除非考虑到缓冲的情况。