Standard streams (标准流) 详情

作者 : 开心源码 本文共1508个字,预计阅读时间需要4分钟 发布时间: 2022-05-12 共172人阅读

详情

在Unix系统及类Unix系统中,Standard streams(标准流)是计算机程序与其环境之间,信息输入和输出的通道。包括stdin,stdout和stderr.
根据POSIX协议,这3个标准流都有自己对应的文件形容符(File_descriptor):

文件形容符(整数值)名称<unistd.h>符号常量<stdio.h>文件流
0Standard inputSTDIN_FILENOstdin
1Standard outputSTDOUT_FILENOstdout
2Standard errorSTDERR_FILENOstderr

Standard Streams

起源

a. 标准流(Standard streams)的起源

在Unix之前的操作系统,程序必需明确指出链接到合适的输入和输出数据。对这当中的许多系统而言,这牵涉少量错综复杂而又与特定操作系统相关的事,过程相当复杂(如控制环境设置、访问一个文件表格、决定区域数据集、和决定读卡器、磁带、磁盘、打印机、打卡机或者交互式终端机)。

Unix 的伟大开创贡献之一,就是是提供 笼统设施 :它免除了程序须要知道或者在意它正与哪个设施沟通。 Unix 借由数据流的概念来消除这种复杂。数据流是指一种数据字节的有序序列,在其读到文件结尾(End of file, EOF)之前可以一直被读取。另一个 Unix 突破为默认自动链接输入和输出,程序(或者者说编写它的程序员),不用为了文件的输入、输出操心。在此之前,程序员需要用复杂的工作控制语言创立链接,协调责任。

b. 文件形容符(File_descriptor)的起源

linux为了实现一切皆文件的设计哲学,不仅将数据笼统成了文件,也将一切操作和资源笼统成了文件,比方说硬件设施,socket,磁盘,进程,线程等。这样的设计将系统的所有动作都统一起来,实现了对系统的原子化操作,大大降低了维护和操作的难度,想想看,对于socket,硬件设施,我们只需读读写写文件就能对其进行操作是多么爽的一件事。

那么在操作这些所谓的文件的时候,我们不可能没操作一次就要找一次名字吧,这样会耗费大量的时间和效率。咱们可以每一个文件操作一个索引,这样,要操作文件的时候,我们直接找到索引即可以对其进行操作了。我们将这个索引叫做文件形容符(file descriptor),在系统里面是一个非负的整数。每打开或者创立一个文件,内核就会向进程返回一个fd,第一个打开文件是0,第二个是1,依次递增。

Linux的根目录/dev是 Device(设施)的缩写。该目录下存放的是 Linux 的外部设施,在 Linux 中访问设施的方式和访问文件的方式是相同的。从该目录下的内容也可以看到标准流的影子

$ ll /dev |grep stdlrwxrwxrwx   1 root root          15 Jul 27 16:54 stderr -> /proc/self/fd/2lrwxrwxrwx   1 root root          15 Jul 27 16:54 stdin -> /proc/self/fd/0lrwxrwxrwx   1 root root          15 Jul 27 16:54 stdout -> /proc/self/fd/1    $ # Linux的文件形容符可以通过 /proc/PID/fd/ 路径获取使用。

应用

  1. Linux命令行中,可以通过重定向符号(例如:>)来控制标准流的输出,使用实例。
  2. Java应用当中,也可以通过java.lang.Process类来读取/写入标准流,可参考源码方法注释。

Ref:

  1. https://en.wikipedia.org/wiki/Standard_streams
  2. https://www.songma.com/p/504a53c30c17

说明
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是摆设,本站源码仅提供给会员学习使用!
7. 如遇到加密压缩包,请使用360解压,如遇到无法解压的请联系管理员
开心源码网 » Standard streams (标准流) 详情

发表回复