为什么“一切皆文件”是 Unix 操作系统独有的?

为什么“一切皆文件”是 Unix 操作系统独有的?

我经常听到人们说“Unix 的独特哲学是它将一切视为文件”或“在 Unix 中,一切皆文件”。但我从未听过有人解释为什么这是 Unix 独有的。

那么,为什么这是 Unix 独有的?其他操作系统(例如 Windows 和 Mac)不操作文件吗?

并且,与其他操作系统相比,它是否独特?

答案1

那么,为什么这是 Unix 独有的呢?

在 Unix 之前,典型的操作系统以一种方式处理文件,并根据设备的特性处理每个外围设备。也就是说,如果程序的输出被写入磁盘上的文件,那么输出只能到磁盘上;您不能将其发送到打印机或磁带驱动器。每个程序都必须知道用于输入和输出的每个设备,并且具有处理备用 I/O 设备的命令选项。

Unix 将所有设备视为文件,但具有特殊属性。为了简化程序,标准输入标准输出是程序的默认输入和输出设备。因此,通常用于控制台屏幕的程序输出可以发送到任何地方,可以是磁盘文件、打印机或串行端口。这称为I/O 重定向

其他操作系统比如Windows、Mac难道不对文件进行操作吗?

当然,所有现代操作系统都支持各种文件系统,并且可以“操作文件”,但区别在于如何处理设备?不知道 Mac 的情况,但 Windows 确实提供了一些 I/O 重定向。

并且,与其他操作系统相比,它有何独特之处?

现在情况已经不同了。Linux 也有同样的功能。当然,如果操作系统采用 I/O 重定向,那么它就会倾向于使用其他 Unix 功能,最终变成类 Unix。

答案2

“一切都是文件”这一理念源自 Multics。Unix 的设计者们在前辈的基础上进行了大量工作,尤其是 Multics。事实上,计算领域的很多东西都是基于前辈的。

您可以阅读已故 Dennis Ritchie 在 Unix 设计方面的工作以了解更多信息。他提到了他们从 Multics “复制” 的东西,例如树状文件系统、命令 shell 和文件的非结构化。我并不是在暗示 Unix 的人从 Multics 那里偷了东西。无论出于何种目的,他们都是同一个人。

答案3

独特?不。定义?绝对是。

将所有内容作为已知层次结构中的文件或设备意味着您可以对所有内容使用同一套工具。贝尔实验室的 Plan 9甚至将硬件设备作为文件来进一步实现这一点。

更重要的是,这允许两个非常简单而强大的概念。 基本实用程序可以很好地完成一件事(tm),可以根据需要将它们与管道串联在一起。 想在文本文件中查找某些内容? 使用cat显示它,将其传递grep,然后您就可以用煤气做饭了。那是“Unix”方式的真正威力——专门的应用程序协同工作,提供大量的灵活性。

Mac OS X 也遵循了 Unix 哲学,但它隐藏得更好(一个“应用程序”包实际上是一个充满文件的目录),事实上它是一个真正的、经过认证的 Unix,源自下一个,它使用了FreeBSD

在 Windows 中,有一些二进制组件,例如事件查看器和注册表,在特定场景中,它们具有一些速度优势。

答案4

我可能会因为这样说而被痛骂,但我认为说 Unix 中的一切都是文件实际上是一个谬论。它实际上是两件事。

  1. 文件和设备(以及许多其他东西)是可以通过由打开、关闭、读取、写入和控制(ioctl)功能组成的接口建模的对象。
  2. 这些对象的命名空间是分层的,即这些对象按层次结构组织。

文件系统实现了这个命名空间,并实现了允许将接口函数分派给这些对象的框架。文件系统最初被概念化为存放文件,但后来被用来组织命名空间层次结构中的其他对象。这是面向对象出现之前的多态性的一个例子。

将所有东西都称为文件并没有什么坏处。但实际上,它们是这些更通用的对象(文件就是其中一种对象)。从这个角度来看,这个想法并不是 Unix 独有的。许多其他操作系统都实现了这种多态对象层次结构。

相关内容