解释“在 Linux 和 UNIX 中,一切都是文件”

解释“在 Linux 和 UNIX 中,一切都是文件”

请有人告诉我上面这段诗的意思。

“在 Linux 和 UNIX 中,一切皆文件”

答案1

该表述比较模糊,没有单一的定义,但一般有以下几种解释:

  1. 可以通过与文件相同或类似的工具来操作对象。 到引述 Linus Torvalds

    “一切皆文件”的要点不在于你拥有一些随机的文件名(事实上,套接字和管道表明“文件”和“文件名”彼此无关),而在于你可以使用常用工具来操作不同的东西。

    其中最显著的例子就是网络套接字。虽然操作这些套接字的系统调用不同,但概念是相同的。实际上,管道是文件描述符对,因此对它们的写入是通过与文件相同的系统调用进行的write()read()尽管无法lseek()对它们使用)。

    计算机的现实是,数据在上下文中才有意义。对于一个应用程序来说,数据可能只是字节流,而对于另一个应用程序来说,数据则是有意义的输入。因此,在 Linux/Unix 操作系统下,拥有处理数据的通用工具,但让应用程序决定如何处理这些数据是关键部分。

    用文件的方式处理不同项目的一致工具集也很重要。例如文件描述符:我们可以拥有完全相同的对象来打开和读取,但该对象可以是网络套接字、匿名或命名管道、加载到内存中的文件等。

  2. 项目在其各自的文件系统上都有 inode 编号。具体来说,目录只是 inode 列表的文件。管道在内核的虚拟管道上有 inode。因此,这里的想法是,有一种一致的方式可以通过相同的方法抽象和识别不同的对象;即这里的关键字是一致性。另请参阅如果 Linux 上的所有内容都是文件,那么目录是什么?

    Linux 内核的一大优点是能够提供虚拟文件系统。引用混乱关于相关(如果不是跨站点重复)的问题:

    “万物皆文件”这句话定义了操作系统的架构。这意味着系统中的一切,从进程、文件、目录、套接字、管道……都由内核中虚拟文件系统层抽象出的文件描述符表示。虚拟文件系统是内核提供的接口。因此,这句话被更正为“万物皆文件描述符”。Linus Torvalds 本人又更精确地更正了这句话:“万物皆字节流”。

    当然,遵循一致性的概念,虚拟文件​​系统对象通过与真实文件系统相同的方式抽象 - 引用文件系统上特定实体的 inode 编号。该文件系统的结构可能是什么应该无关紧要 - 应该应用相同的工具并以相同的方式引用对象,因为它们只是字节序列。

  3. 设备可以表示为/dev/文件系统下的类似文件的对象。这句话经常受到质疑,尤其是上面 Linus 的引述。严格地说,它们不是传统意义上硬盘上的文件,其中包含数据(尽管维基百科文章本主题中对设备文件表示的描述与开头段落中的解释完全一致。/dev/sda1块设备和/dev/zero字符设备等对象是内核中连接到设备驱动程序的对象。阅读Gilles 在相关文章中的回答

    不过,值得承认的是,这种方法也得到了广泛的应用。特别是,Unix的一些原始创建者也参与了Plan 9操作系统的开发。引用PH7 文章

    例如,Plan 9 操作系统率先采用了一种完全集成的系统资源方法:Plan 9 愿景的基石是不仅要通过文件系统表示设备和通信通道,还要表示所有系统接口。例如,Plan 9 的设计人员指出,在 UNIX 中,网络设备不能完全被视为常规文件:它们是通过具有不同打开语义且位于不同名称空间(互联网套接字的主机和端口)中的套接字访问的。Plan 9 的实施表明,您可以成功地将所有本地和远程设备统一到一个全局命名空间中。这个概念最终以 portalfs 的形式回归到 UNIX。

附注:相关帖子引用 1990 年文件使用大容量内存的文件系统设计由 Carl Staelin 和 Hector Garcia-Molina 撰写,其中指出:

在 iPcress 中,一切都是文件,包括文件头的索引表(inode 表)。这是 UNIX 哲学的延伸,即“所有文件都只是字节流”。

因此,Unix 最初的设计可能旨在实现通用接口,通过相同的实用程序平等地处理字节流,这不可避免地发展成为“一切皆文件”的理念,尽管可以相当准确地说,文件实际上只是有组织的字节序列。

相关内容