深入理解Linux文本流

相信很多人都知道什么是系统文件 , 但很少人知道文本流是什么 , 其实文本流不难理解 , 下面小编就给大家详细介绍下Linux文本流 , 一起来学习下吧 。
文本流
文件用于数据的存储 , 相当于一个个存储数据的房子 。我们之前说 , 所谓的数据是0或者1的序列 , 但严格来说 , Linux以字节(byte)来作为数据的单位 , 也就是说这个序列每八位(bit)为一个单位(八位二进制对应的十进制范围为0到255) 。使用ASCII编码 , 可以将这样一个字节转换成为字符 。所以 , 在Linux中 , 我们所说的数据 , 完全可以用字符表达出来 , 也就是说文本(text)的形式 。
实际上 , 如果以bit为单位处理字符的话 , 机器会更容易读懂和传输 , 效率会更高 。但为什么Linux依然以字节为单位进行处理呢?原因在于 , 相对于以bit为单位处理数据 , 以byte为单位可以更容易将数据转化为字符 。相对于枯燥的0和1 , 字符更容易被人读懂 (human readable) 。然而 , 并不是所有的数据都是设计来让人读懂的 , 比如可执行文件包含的各种字符对于人来说并没有什么意义 (因为可执行文件是为了让机器读懂的) 。但Linux依然以字节为单位处理所有文件 , 这是为了让所有文件能够共用一套接口 (virtual file system) , 从而减少Linux设计的复杂度 。
(“everything is a file”是通常所流传的UNIX设计的哲学之一 , 但Linus对此作出纠正 , 改为“everything is a stream of bytes” 。)
然而 , 数据不是在找到了自己的房子(file)之后就永远的定居下来 。它往往要被读入到内存 (就像是到办公室上班) , 或者被传送到外部设备(好像去酒店休假) , 或者搬到别的房子中 。在这样的搬迁过程中 , 数据像是一个个排着队走路的人流 , 我们叫它文本流(text stream , 或者byte stream) 。然而 , 计算机不同设备之间的连接方法差异很大 , 从内存到文件的连接像是爬山 , 从内存到外设像是游过一条河 。为此 , Linux还定义了流 (stream) , 以此作为修建连接各处的公路的标准 。Stream的好处在于 , 无论你是从内存到外设 , 还是从内存到文件 , 所有的公路都是相同的 (至于公路下面是石头还是土地 , 都可以不用操心) 。
我们再回味一下“everything is a stream of bytes”这句话 。信息包含在文本流中 , 不断在计算机的各个组件之间流动 , 不断地接受计算机的加工 , 最终成为用户所需要的某种服务 。
(说句题外话 , 如果看过骇客帝国的话 , 一定会对文本流印象深刻 。)

深入理解Linux文本流


标准输入 , 标准输出 , 标准错误与重新定向
当Linux执行一个程序的时候 , 会自动打开三个流 , 标准输入(standard input) , 标准输出(standard output) , 标准错误(standard error) 。比如说你打开命令行的时候 , 默认情况下 , 命令行的标准输入连接到键盘 , 标准输出和标准错误都连接到屏幕 。对于一个程序来说 , 尽管它总会打开这三个流 , 但它会根据需要使用 , 并不是一定要使用 。

推荐阅读