我经常听到人们说“ Unix的独特哲学是将所有内容都视为文件”或“在Unix中,所有内容都是文件”。但是我从未听说过有人解释过为什么它对于Unix是唯一的。
那么,为什么这是Unix独有的呢?Windows和Macs等其他操作系统是否无法在文件上运行?
并且,与其他操作系统相比,它是否独特?
我经常听到人们说“ Unix的独特哲学是将所有内容都视为文件”或“在Unix中,所有内容都是文件”。但是我从未听说过有人解释过为什么它对于Unix是唯一的。
那么,为什么这是Unix独有的呢?Windows和Macs等其他操作系统是否无法在文件上运行?
并且,与其他操作系统相比,它是否独特?
Answers:
那么,为什么这是Unix独有的呢?
在Unix之前,典型的操作系统以一种方式处理文件,并根据该设备的特性对每个外围设备进行处理。也就是说,如果将程序的输出写入磁盘上的文件,则该输出只能进入该位置。您无法将其发送到打印机或磁带机。每个程序必须知道用于输入和输出的每个设备,并且必须具有用于处理备用I / O设备的命令选项。
Unix将所有设备都视为文件,但是具有特殊属性。为了简化程序,标准输入和标准输出是程序的默认输入和输出设备。因此,通常用于控制台屏幕的程序输出可以到任何地方,到磁盘文件,打印机或串行端口。这称为I / O重定向。
Windows和Macs等其他操作系统是否无法在文件上运行?
当然,所有现代OS都支持各种文件系统,并且可以“对文件进行操作”,但是区别在于如何处理设备?不了解Mac,但是Windows确实提供了一些I / O重定向。
而且,与其他操作系统相比,它具有独特性吗?
不再是了。Linux具有相同的功能。当然,如果操作系统采用I / O重定向,则它倾向于使用其他Unix功能,并最终变成类Unix。
WriteFile
。但是此外,还有一个更大的“同步对象”类别,其中不仅包括文件,还包括互斥体。
“一切都是文件”的想法来自Multics。Unix的设计人员将许多工作都建立在其前身,尤其是Multics上。确实,计算中的许多东西都基于前辈。
您可以阅读Dennis Ritchie在Unix设计中的最新著作,以获取更多信息。他引用了他们从Multics中“复制”的内容,例如树状文件系统,命令外壳和文件的非结构化。我并不是在暗示Unix伙计从Multics伙计那里偷走了。无论出于何种意图和目的,都是同一个人。
独特?不,定义吗?绝对。
将所有内容都以已知的层次结构作为文件或设备,意味着您可以对所有内容使用相同的工具集。Bell Labs的Plan 9甚至将硬件设备作为文件进行了扩展。
更重要的是,这允许两个非常简单而强大的概念。基本的实用程序,可以完成一件事(tm),可以根据需要将其与管道捆绑在一起。是否想在文本文件中找到内容?使用cat
来显示它,使其通过grep
,然后您就可以用天然气烹饪。这就是 “ Unix”方式的真正力量-专门的应用程序可以协同工作以提供大量的灵活性。
Mac OS X也遵循Unix的哲学,但是隐藏得更好(“应用程序”捆绑包实际上是一个充满文件的目录),并且实际上是一个经过认证的Unix Unix ,它是使用FreeBSD的NeXT衍生而来的。
在Windows中,此后有一些二进制组件,例如事件查看器和注册表,并且在这种特定情况下还有一些速度优势。
由于特殊文件。当人们说“一切都是Unix中的文件”时,通用文件和目录并不是他们想要的。特殊文件是类Unix操作系统所独有的,其中有很多。因此,它并不是Unix 独有的。
特殊文件有多种用途。例如,有管道,套接字,最值得注意的是设备文件。管道和套接字是进程之间的通信流。子系统的许多功能可通过设备文件提供给用户空间。
程序使用它们就像使用普通文件一样。实际上,大多数时候他们甚至都不在乎所使用的文件类型。这就是为什么Unix命令可以如此多地组合以形成功能强大的新系统的原因。(请参阅锯末答案中的I / O重定向)
如前所述,这些充当用户空间的接口。例如,为了弹出CD托盘,编程人员将首先打开相应的设备文件。另一个示例:您希望程序切换虚拟终端。首先打开/ dev / console。
接下来发生的事情并不仅仅发送字符到这些文件,但发出的ioctl()的对他们。您可以发行的单个ioctl取决于设备。例如,控制台记录在console_ioctl(4)中
我可能会因为这样说而感到困惑,但是我认为说所有东西都是Unix中的文件实际上是一个谬论。这实际上是两件事。
文件系统实现此名称空间,并实现允许将接口功能分配给这些对象的框架。首先将文件系统概念化以容纳文件,但是随后选择了文件系统来组织名称空间层次结构中的其他对象。一个来自面向对象之前的多态的例子就是一件事。
仅调用所有文件没有什么害处。但实际上,它们是这些更通用的对象(文件就是这样的对象)。从这个角度来看,这个想法根本不是Unix独有的。许多其他OS也实现了此类多态对象的层次结构。
mmap()
……。)
当人们说“在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不会将设备视为文件,这是“一切都是文件”含义的一部分。
我看到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占用了更多的东西,但是您的行程可能会有所不同。
请注意,即使Linus Torvalds也不同意“一切都是文件”。如果您搜索“
一切都是字节流
“您会发现有趣的哲学,这意味着我们什么意思都不是文件,例如内存中的抽象数据结构或指针肯定不是文件,可以肯定的是,任何东西都可以表示为文件,但是表示和是2种不同的动作。
The UNIX philosophy is often quoted as "everything is a file", but that really means "everything is a stream of bytes".