如何理解“Unix 里一切都是文件”这句话-在 UNIX 中,一切都是字节流
UNIX 操作系统的设计、用户界面、文化和演变都是建立在它的一套统一的想法和概念上。其中最重要的一点可能是“一切皆文件”,而这个概念被认为是 UNIX 的灵魂之一。
这一关键设计原则提供了一个统一的范式,用于访问各种输入输出资源:文档、目录、磁盘驱动器、CD-ROM、调制解调器、键盘、打印机、显示器、终端,甚至是一些进程间通信和网络通信。所有这些资源拥有一个通用的抽象,UNIX 之父将其称为“文件”。因为每个“文件”都通过相同的 API 暴露出来,所以你可以使用同一组基本命令来读取和写入磁盘、键盘、文档或网络设备。
这个基本概念实际上有双重含义:
- 在 UNIX 中,一切都是字节流
- 在 UNIX 中,文件系统是统一的命名空间
在 UNIX 中,一切都是字节流
那么 UNIX 中的文件是由什么组成的?文件只不过是可以读取和写入的普通字节的集合。如果你持有一个文件引用(也就是文件描述符),就可以使用相同的一组 API 进行 IO 操作,无论设备的类型和底层硬件是什么。
纵观历史,UNIX 是第一个对所有 IO 操作进行统一抽象并提供一小组操作原语的操作系统。当时,大多数操作系统为每种设备或设备家族提供单独的 API。一些早期的微型计算机操作系统甚至要求你使用多个用户命令来复制文件——不同大小的软盘需要使用不同的命令!
从程序员和用户的角度来看,UNIX 通过字节流的形式暴露了如下的资源:
存储在磁盘上的文档、目录、链接、大容量存储设备(如磁盘驱动器、CD-ROM、磁带、USB)、
进程间通信(例如管道、共享内存、UNIX 套接字)、
网络连接、交互式终端、其他设备(如打印机、图形卡)。
用户可以对这些字节流进行
读(read)、写(write)、随机访问(lseek)和关闭(close)操作。
统一的 API 对于 UNIX 程序来说非常重要:你可以尽情地开发一个处理文件的程序,却不需要知道文件内容究竟是来自哪里,它们可能保存在本地磁盘或网络某处的远程驱动器上,或者是通过网络流入、由用户输入,甚至是由另一个程序在内存中生成。这大大降低了程序的复杂性,并简化了开发人员的学习曲线。这一基本特性让程序开发变得轻而易举(你只需与两个特殊文件打交道:标准输入和标准输出)。
不过需要注意的是,虽然所有文件都提供了统一的 API,但某些特定类型的设备可能不支持某些操作。例如,你无法对鼠标设备进行 lseek 操作,也无法在 CD-ROM 设备上进行 write 操作(假设你的 CD 是只读的)。
在 UNIX 中,文件系统是统一的命名空间
在 UNIX 中,文件不只是具有统一 API 的字节流,还可以通过统一的方式来引用它们:文件系统就是统一的命名空间。
全局命名空间和挂载机制
UNIX 的文件系统路径提供了统一的模式来标记资源,无论其性质如何。例如,你可以使用 /usr/local 引用本地目录,使用 /home/joe/memo.pdf 引用一个文件,使用 /mnt/cdrom 引用 CD-ROM,使用 /usr 引用网络驱动器上的目录,使用 /dev/sda1 引用一个磁盘分区,使用 /tmp/mysql.sock 引用 UNIX 域套接字,使用 /dev/tty0 引用终端,或使用 /dev/mouse 引用鼠标。这个全局命名空间通常被视为文件和目录的层次结构。文件路径可以引用几乎任何东西:文件系统、设备、网络共享或通信通道。
命名空间是分层的,所有资源可以从根目录(/)开始引用。你可以访问同一命名空间内的多个文件系统:只需要将其他设备或文件系统(如外部磁盘驱动器)“附加”到命名空间的某个位置(如 /backups)。在 UNIX 术语中,这个操作叫作挂载(mount)文件系统,而挂载文件系统的位置称为挂载点(mount point)。你可以将挂载文件系统里的所有资源视为全局命名空间的一部分,只要在访问这些资源时使用挂载点作为前缀(例如 /backups/myproject-Oct07.zip)。
伪文件系统
在早期,UNIX 通过提供全局 API 并将设备放入统一的文件系统命名空间,极大促进了输入输出资源的集成。这种方法非常成功,以至于越来越多的资源和系统服务被作为文件系统全局命名空间的一部分。Plan 9 操作系统开创了这一壮举,现在已经出现在了所有的现代 UNIX 系统中。
这种方式导致出现了大量的伪文件系统,它们的行为类似于普通文件系统,但可用于访问与传统文件系统不直接相关的资源。例如,你可以使用伪文件系统来查询和控制进程、访问内核或建立 TCP 连接。这些伪文件系统提供了文件系统语义,用于表示结构化的信息,并为各种对象提供统一的访问方式。伪文件系统(有时也称为虚拟文件系统)通常没有实际的物理存储,它们是基于内存的。
结论
在现代 UNIX 操作系统中,所有的设备和大多数进程间通信都被视为文件系统层次结构中的文件或伪文件。这种 UNIX 愿景和设计原则被称为“一切皆文件”,是 UNIX 保持成功和长青的关键因素之一。它提供了一个强大而简单的抽象,作为系统、工具和社区的构建基础。更重要的是,它提供了强大的集成和基本的组合机制,通过连接工具和应用程序来解决眼前的问题。
尽管“一切皆文件”的理念取得了成功,但有些人对它的普遍适用性持怀疑态度。如果说文件被视为字节流,那么就会缺少对元数据的支持:为了能够正确地处理文件,应用程序必须使用自己的方法来确定文件的类型、结构和语义。此外,为了保留元数据,处理文件的工具必须保持元数据不变(例如图片的 XMP 信息)。因此,尽管将 UNIX 文件视为字节流对于基于文本接口的程序交互来说非常有用,但在处理多媒体和二进制文件方面却带来了严重的局限性。
尽管存在局限性,但大多数人仍然承认这个理念所具备的强大威力以及它对操作系统集成产生的巨大影响。自 UNIX 首次发布以来,研究人员一直在努力推广这一核心理念。
英文原文:https://ph7spot.com/musings/in-unix-everything-is-a-file
https://www.infoq.cn/article/in-unix-everything-is-a-file
如何理解“Unix 里一切都是文件”这句话-在 UNIX 中,一切都是字节流的更多相关文章
- 正确理解Widget::Widget(QWidget *parent) :QWidget(parent)这句话(初始化列表中无法直接初始化基类的数据成员,所以你需要在列表中指定基类的构造函数)
最近有点忙,先发一篇我公众号的文章,以下是原文. /********原文********/ 最近很多学习Qt的小伙伴在我的微信公众号私信我,该如何理解下面段代码的第二行QWidget(parent) ...
- 正确理解Widget::Widget(QWidget *parent) :QWidget(parent)这句话
原文:https://zhuanlan.zhihu.com/p/31310536 /********原文********/ 最近很多学习Qt的小伙伴在我的微信公众号私信我,该如何理解下面段代码的第二行 ...
- 诠释Linux中『一切都是文件』概念和相应的文件类型
导读 在 Unix 和它衍生的比如 Linux 系统中,一切都可以看做文件.虽然它仅仅只是一个泛泛的概念,但这是事实.如果有不是文件的,那它一定是正运行的进程. 要理解这点,可以举个例子,您的根目录( ...
- 深入理解pandas读取excel,txt,csv文件等命令
pandas读取文件官方提供的文档 在使用pandas读取文件之前,必备的内容,必然属于官方文档,官方文档查阅地址 http://pandas.pydata.org/pandas-docs/versi ...
- C++的IO处理中的头文件以及类理解(2)<sstream>头文件
C++的IO处理中的头文件以及类理解(2)<sstream>头文件 头文件<sstream>中定义的类型都继承iostream头文件中定义的类型.除了继承得来的操作,sstre ...
- Unix系统编程()文件描述符和打开文件之间的关系
目前学习到的是一个文件描述符对应着一个打开的文件,似乎是对应的关系.但是实际上并不是这样的.多个文件描述符指向同一个打开的文件,是可能的也是必要的.这些文件描述符可以在相同或者不同的进程中打开. 要理 ...
- vs里 .sln和.suo 文件 Visual Studio里*.sln和*.suo文件的作用
Visual Studio里*.sln和*.suo文件的作用 VS项目采用两种文件类型(.sln 和 .suo)来存储特定于解决方案的设置.这些文件总称为解决方案文件,为解决方案资源 ...
- Linux基础: 一切都是文件
一切都是文件 创建系统配置交换分区(用作虚拟内存)加上单根树 file 文件名 查看文件类型 uname 查看系统版本 bin binary二进制文件 所有用户可用 系统可执行命令的二进制文件(c ...
- [置顶] 文件io(一)--unix环境高级编程读书笔记
unix-like(后面以linux为例)系统中的文件操作只需要五个函数就足够了,open.close.read.write以及lseek.这些操作被称为不带缓存的io,这里有必要说一下带缓存和不带缓 ...
随机推荐
- fetch将替代ajax?
原谅我做一次标题党,Ajax 不会死,传统 Ajax 指的是 XMLHttpRequest(XHR),未来现在已被 Fetch 替代. 最近把阿里一个千万级 PV 的数据产品全部由 jQuery 的 ...
- 利用Map解决复杂业务
遍历出题库表的题库名称和题库id,根据题目id即questionBankId获取 分组,即该题库题目总数,该题库题目正确数,该题库已回答题目数. <sqltemplate id="co ...
- [PY3]——字典排序问题总结—(zip()函数、OrderedDict、itemgetter函数)
问题 怎样在数据字典中执行一些计算操作(从而实现求最小值.最大值或排序等等)? 如何能根据某个或某几个字典字段来排序一个字典列表? 如何创建一个字典,并且在迭代或序列化这个字典的时候能够控制元素的顺序 ...
- Silverlight & Blend动画设计系列一:偏移动画(TranslateTransform)
用户界面组件.图像元素和多媒体功能可以让我们的界面生动活泼,除此之外,Silverlight还具备动画功能,它可以让应用程序“动起来”.实际上,英文中Animation这个单词的意思是给某物带来生命. ...
- java通过超链接和servlet配置实现服务器文件下载
1.在页面上面我们可以简单的写成: <td align="center""> <a href="<c:url value="/ ...
- 51Nod1957 有限背包计数问题
传送门 另一个传送门 这题还挺有意思…… 先贴一波出题人的题解…… (啥你说你看不见?看来你还没过啊,等着A了再看或者乖乖花点头盾好了……) 然后是我的做法……思想都是一样的,只是细节不一样而已…… ...
- angular之$on、$emit、$broadcast
1.$scope.$on view事件 //View被加载但是DOM树构建之前时: $scope.$on('$viewContentLoading', function(event, viewConf ...
- Java xml 操作(Dom4J修改xml + xPath技术 + SAX解析 + XML约束)
1 XML基础 1)XML的作用 1.1 作为软件配置文件 1.2 作为小型的"数据库" 2)XML语法(由w3c组织规定的) 标签: 标签名不能以数字开头,中间不能有空格,区分大 ...
- C++程序员必需的修养
原文:http://www.cnblogs.com/ctoroad/archive/2006/03/24/357423.html 我总结了在用C/C++语言(主要是C语言)进行程序写作上的三十二个“修 ...
- ANN神经网络——Sigmoid 激活函数编程练习 (Python实现)
# ---------- # # There are two functions to finish: # First, in activate(), write the sigmoid activa ...