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

Som*_*ent 72 unix operating-systems

我经常听到人们说“Unix 的独特哲学是它把一切都当作一个文件”或“在 Unix 中,一切都是一个文件”。但我从来没有听过任何人解释为什么它是 Unix 独有的。

那么,为什么这是 Unix 独有的呢?Windows 和 Mac 等其他操作系统对文件不进行操作吗?

而且,与其他操作系统相比,它是否独一无二?

saw*_*ust 55

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

Unix 之前的典型操作系统以一种方式处理文件,并根据该设备的特性处理每个外围设备。也就是说,如果程序的输出被写入磁盘上的文件,那是输出可以去的唯一地方;您无法将其发送到打印机或磁带机。每个程序都必须了解用于输入和输出的每个设备,并具有处理备用 I/O 设备的命令选项。

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

Windows 和 Mac 等其他操作系统对文件不进行操作吗?

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

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

真的没有了。Linux 具有相同的功能。当然,如果一个操作系统采用 I/O 重定向,那么它往往会使用其他 Unix 特性,最终会变成类 Unix。

  • OS X 基本上是 Unix,所以没有太大区别。 (29认同)
  • 文件模型的所有内容都有[更多](http://en.wikipedia.org/wiki/Ioctl)。 (7认同)
  • Plan 9 有相同的概念一切都是文件概念,甚至被称为“more unix then unix” (3认同)
  • Windows(自 NT 起)走得更远。有许多设备的行为类似于文件,例如串行端口和命名管道。您可以使用 `WriteFile` 写入所有文件。但此外,还有一个更大的“同步对象”类别,不仅包括文件,还包括互斥锁。 (2认同)
  • @slhck 与 Linux 不同,OS X 是经过认证的 UNIX 操作系统。 (2认同)

Pat*_*our 34

“一切都是文件”的想法来自 Multics。Unix 的设计者的很多工作都基于前辈,尤其是 Multics。事实上,计算中的很多东西都是基于前辈的。

您可以阅读已故丹尼斯·里奇 (Dennis Ritchie) 在 Unix 设计方面的更多工作。他引用了他们从 Multics“复制”的东西,例如树状文件系统、命令外壳和文件的非结构化。我并不是在暗示 Unix 人员从 Multics 人员那里偷了东西。无论出于何种意图和目的,都是同一个人。

  • @LieRyan:实际上它确实回答了为什么它*独特*的问题:它不是。 (15认同)
  • 这不应该是投票最高的答案,它没有回答问题,它只是乞求人们提出另一个问题:“为什么在 Multics 中‘一切都是文件’?” (6认同)
  • @Lie Ryan - 问题不在于为什么所有内容都是文件,而是为什么它是独一无二的。正如 Goran 和我指出的那样,事实并非如此。 (2认同)

Jou*_*eek 28

独特的?不。定义?绝对地。

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

更重要的是,这允许两个非常简单和强大的概念。做 One Thing Well (tm) 的基本实用程序,可以根据需要将它们与管道串在一起。想在文本文件中查找内容吗?使用cat表现出来,将其穿过grep,而你用天然气做饭。这就是“Unix”方式的真正力量——专门的应用程序协同工作以获得巨大的灵活性。

Mac OS X 也遵循 Unix 哲学,但它更好地隐藏(“应用程序”包实际上是一个充满文件的目录),并且实际上是一个适当的、经过认证的 Unix,继承自NeXT,它使用了一些FreeBSD

在 Windows 中,有一些二进制组件,例如事件查看器和注册表,并且在这种特定情况下有一些速度优势。

  • 嗯,计划 9 就是计划 9,它已经可以运行了。Fuse 只允许用户空间文件系统以……有趣的方式扩展。我喜欢将 IRC 视为 FS 的那个。 (2认同)
  • 我相信还有一个更新的版本,叫做 inferno (2认同)

wnr*_*rph 19

由于特殊文件。当人们说“在 Unix 中一切都是文件”时,常见的文件和目录并不是他们想到的。特殊文件是类 Unix 操作系统所独有的,其中有很多。所以它不是Unix独有

特殊文件有多种用途。有例如管道、套接字和最显着的设备文件。管道和套接字是进程之间的通信流。子系统的大部分功能都通过设备文件提供给用户空间。

管道和插座

程序使用它们就像使用普通文件一样。事实上,大多数时候他们甚至不关心他们使用什么类型的文件。这就是为什么 Unix 命令可以如此多样化地组合以形成强大的新系统的原因。(请参阅锯末答案中的 I/O 重定向)

设备文件

如前所述,这些就像用户空间的接口一样。例如,为了弹出光盘托盘,程序员首先要打开相应的设备文件。另一个例子:你想让你的程序切换虚拟终端。首先打开 /dev/console。

接下来发生的事情并不仅仅发送字符这些文件,但发出的ioctl()他们。您可以发出的各个 ioctl 取决于设备。例如,控制台记录在console_ioctl(4)


Zif*_*ion 12

我可能会因为这样说而感到生气,但我认为在 Unix 中说一切都是文件实际上是一种谬论。它的真正含义是两件事。

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

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

只调用所有文件没有坏处。但实际上,它们是这些更通用的对象(文件就是这样的一个对象)。从这个角度来看,这个想法根本不是 Unix 独有的。许多其他操作系统实现了多态对象的这种层次结构。


小智 9

当人们说“在 Unix 中,一切都是文件”时,他们的意思是不是文件的东西也被视为文件。

当然,大多数操作系统都使用文件。文本文件、图像文件、声音文件。但并非所有操作系统都将设备视为文件。这是一个重要的区别。如果我在我的 Ubuntu 操作系统(基于 Unix)中列出我的 /dev/ 文件夹的内容,我会得到一个包含 200 多个设备的列表。其中一些设备是硬件,但显示在文件夹中。例如硬盘驱动器、USB 端口、鼠标和键盘、音频设备和打印机等。一些设备是虚拟的,例如 /dev/urandom,它表现为一个充满随机数的无限文件。它不是我硬盘上的真实文件。

所有这些设备都被视为文件。我可以从这些设备读取数据和/或将数据写入这些设备。这里有将数据从不同设备复制到音频设备的示例。这是可能的,因为它们被视为文件。(极客)结果是能够聆听硬盘驱动器的内容、鼠标运动、计算机内存或图像的像素。如果设备不被视为文件,这将更难实现,因为每个设备都需要不同的方法来读取和写入数据。

话虽如此,“一切”的含义因系统而异。例如,OS X 基于 Unix,但没有 /dev/audio 设备。它使用名为 CoreAudio 的专有音频系统。所以在这种情况下,人们可能会说“几乎所有东西都是一个文件”。然后,在像 Windows 这样“一切都不是文件”的系统中,您仍然可以执行诸如将文件内容复制到打印机端口(键入类似copy mydocument.txt >lpt1:)之类的操作,这类似于在 Unix 中将文档复制到打印机设备系统。

Windows 和 OS X 等其他操作系统对文件不进行操作吗?是的,他们这样做。Windows 和 OS X 对文件进行操作,但 Windows 不会将设备视为文件,这就是“一切都是文件”的含义的一部分。


小智 8

我看到 Multics 被引用为“一切都是文件”的来源,但我认为您必须比设备文件、命名管道、常规文件等更深入一些。您必须查看文件命名语法。即使存在 AUX、CON 和 LP“魔法文件名”,这也会产生很大的不同。

参见Rob Pike 的“ The Hideeous Name ”。它将 Unix 文件命名语法与其他一些语法进行了比较,最著名的是 VMS。请注意,60 年代末/ 70 年代初的大型机操作系统,当 Unix 出现时,具有现代人认为非常洛可可文件命名语法的东西。自从我使用 VM/CMS 或 NOS 或 NOS/VE 已经有好几年了,我只是在使用 Univac OS 的人的肩膀上看过,但足以说怪癖超过了规律性。

我什至从未见过 Multics 运行,但您可以在其文件系统上看到一篇论文。看起来最初的 Unix 比 Multics 更进一步地采用了“一切都是文件”,但你的里程可能会有所不同。