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


70

我经常听到人们说“ Unix的独特哲学是将所有内容都视为文件”或“在Unix中,所有内容都是文件”。但是我从未听说过有人解释过为什么它对于Unix是唯一的。

那么,为什么这是Unix独有的呢?Windows和Macs等其他操作系统是否无法在文件上运行?

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


26
旁注:macosx在Unix上运行。
akira

2
首先,高级文件不使用文件(就像* nix中的dbus或X一样),低级Windows是围绕句柄构建的。您可以对它们执行许多操作,就像在* nix上进行文件打开(打开,关闭,控制以及通常发送/接收)一样,但是您必须是程序员才能看到该接口。那是否是一件好事,取决于偏好。
标记

1
一切都是文件,网络接口除外。
alvin 2011年

8
@akira-OSX已通过Unix认证,并且不能“在它之上”运行。
罗布

1
@akira不在Unix之上。OSX是为数不多的经过认证的UNIX OS之一。
Let_Me_Be 2011年

Answers:


53

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

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

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

Windows和Macs等其他操作系统是否无法在文件上运行?

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

而且,与其他操作系统相比,它具有独特性吗?

不再是了。Linux具有相同的功能。当然,如果操作系统采用I / O重定向,则它倾向于使用其他Unix功能,并最终变成类Unix。


29
OS X基本上是Unix,因此没有太大区别。
slhck 2011年

6
文件模型的所有内容还有更多
artistoex 2011年

1
开篇根本就是不对的。Unix之前就有操作系统,并且它们后来具有Unix中发现的功能,包括I / O重定向。
Patrick Seymour

3
计划9具有相同的概念一切都是文件概念,甚至被称为“先有unix再有unix”
William

2
Windows(自NT)以来的发展。许多设备的行为类似于文件,例如串行端口和命名管道。您可以使用写入所有内容WriteFile。但是此外,还有一个更大的“同步对象”类别,其中不仅包括文件,还包括互斥体。
MSalters 2011年

34

“一切都是文件”的想法来自Multics。Unix的设计人员将许多工作都建立在其前身,尤其是Multics上。确实,计算中的许多东西都基于前辈。

您可以阅读Dennis Ritchie在Unix设计中的最新著作,以获取更多信息。他引用了他们从Multics中“复制”的内容,例如树状文件系统,命令外壳和文件的非结构化。我并不是在暗示Unix伙计从Multics伙计那里偷走了。无论出于何种意图和目的,都是同一个人。


6
这不应该是投票率最高的答案,它不能回答问题,而只是让人问另一个问题:“为什么在Multics中'一切都是文件'?”
Lie Ryan

13
@LieRyan:实际上,它的确回答了为什么它独特的问题:不是。
Goran Jovic

1
当Multics项目终止并重命名时,Unix的人们就带着他们的想法。Unix只是一种文字游戏-一个VS很多。
Fiasco Labs

2
@Lie Ryan-问题不是为什么所有文件都是文件,而是为什么它唯一。正如Goran和我指出的,事实并非如此。
Patrick Seymour

1
这个问题实际上指的是“Unix操作系统小号 ”,即家庭。该家族合理地包括Multics和Linux。
MSalters 2011年

28

独特?不,定义吗?绝对。

将所有内容都以已知的层次结构作为文件或设备,意味着您可以对所有内容使用相同的工具集。Bell Labs的Plan 9甚至将硬件设备作为文件进行了扩展。

更重要的是,这允许两个非常简单而强大的概念。基本的实用程序,可以完成一件事(tm),可以根据需要将其与管道捆绑在一起。是否想在文本文件中找到内容?使用cat来显示它,使其通过grep,然后您就可以用天然气烹饪。这就是 “ Unix”方式的真正力量-专门的应用程序可以协同工作以提供大量的灵活性。

Mac OS X也遵循Unix的哲学,但是隐藏得更好(“应用程序”捆绑包实际上是一个充满文件的目录),并且实际上是一个经过认证的Unix Unix ,它是使用FreeBSD的NeXT衍生而来的。

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


1
加1提及计划9。恕我直言,保险丝通过临时和迭代使计划9更接近于实现。
Danny Staple

2
好吧,计划9是计划9,它已经起作用了。保险丝只是允许以有趣的方式扩展用户空间文件系统。我喜欢将IRC视为FS的那个。
Journeyman Geek

嗯-你知道,自从多年前从埃里克·雷蒙德(Eric Raymond)的书中找出来以来,我一直在寻找它。……实际上,我终于克服了“滚蛋”的难题,我下载了ISO并进行尝试。
Danny Staple

2
我相信有一个较新的版本太多,叫地狱
中级野人

1
+1表示OS X的Darwin也是“真正的Unix”。
calum_b 2011年

18

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

特殊文件有多种用途。例如,有管道,套接字,最值得注意的是设备文件。管道和套接字是进程之间的通信流。子系统的许多功能可通过设备文件提供给用户空间。

管道和插座

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

设备文件

如前所述,这些充当用户空间的接口。例如,为了弹出CD托盘,编程人员将首先打开相应的设备文件。另一个示例:您希望程序切换虚拟终端。首先打开/ dev / console。

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


12

我可能会因为这样说而感到困惑,但是我认为说所有东西都是Unix中的文件实际上是一个谬论。这实际上是两件事。

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

文件系统实现此名称空间,并实现允许将接口功能分配给这些对象的框架。首先将文件系统概念化以容纳文件,但是随后选择了文件系统来组织名称空间层次结构中的其他对象。一个来自面向对象之前的多态的例子就是一件事。

仅调用所有文件没有什么害处。但实际上,它们是这些更通用的对象(文件就是这样的对象)。从这个角度来看,这个想法根本不是Unix独有的。许多其他OS也实现了此类多态对象的层次结构。


究竟!在Unix中,所有内容都是文件描述符(不一定是文件!),即所有内容(内存除外)都是I / O,甚至是文件。必须像访问I / O流一样来访问文件(尽管它们是可搜索的,因此在某种程度上是可随机访问的,但是额外的系统调用会付出极高的代价)。(除了可以做的很少的事情之外mmap()……。)
格雷格·A·伍兹2015年

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 Hideous Name ”。它将Unix文件命名语法与其他两种语法(最著名的是VMS)进行了比较。请注意,Unix起源于60年代末/ 70年代初的大型机OS具有现代人所认为的洛可可式文件命名语法。自从我使用VM / CMS或NOS或NOS / VE已有好几年了,而我只是看着使用Univac OS的人的肩膀,但这足以说明怪癖超过了常规。

我什至从未见过Multics运行,但是您可以看到有关其文件系统论文。看起来原始的Unix比Multics占用了更多的东西,但是您的行程可能会有所不同。


1
好吧,在Multics中,除了I / O(虽然也可以映射到内存)之外,所有内容都是内存。在Unix中,所有内容(内存除外)都是文件描述符,包括文件。即在Unix中,一切都是I / O。
格雷格·伍兹

1
顺便说一句,现在存在一个将引导并运行Multics的模拟器。
格雷格·伍兹

3

请注意,即使Linus Torvalds也不同意“一切都是文件”。如果您搜索“

一切都是字节流

“您会发现有趣的哲学,这意味着我们什么意思都不是文件,例如内存中的抽象数据结构或指针肯定不是文件,可以肯定的是,任何东西都可以表示为文件,但是表示和是2种不同的动作。


1
您未提供链接。经过一番搜索,我发现yarchive.net/comp/linux/everything_is_file.html引用了电子邮件线程中Torvald的回复,他在其中暗含了该模型应该是“一切都是文件”的信息。
bgvaughan 2011年

1
其实@bgvaughan它的反面:yarchive.net/comp/linux/everything_is_file.html给出了报价The UNIX philosophy is often quoted as "everything is a file", but that really means "everything is a stream of bytes".
小古林香美

1
@LIttleAncientForestKami:传统上,Unix将文件视为简单的字节流,而不是将文件视为记录流(或既有字节流又有记录流),作为流(或资源派生)的集合或具有更复杂的模型,其中存在几种访问几种不同类型对象的方法。
ninjalj
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.