专栏名称: 聊聊架构
聊聊架构
目录
相关文章推荐
字节跳动技术团队  ·  ByteBrain团队EuroSys25 ... ·  2 小时前  
InfoQ Pro  ·  充电计划 | 反卷“大”模型 ·  4 小时前  
InfoQ Pro  ·  Redis 之父:哪怕被喷我也得说,AI ... ·  4 小时前  
字节跳动技术团队  ·  远程访问代理+内网穿透:火山引擎边缘网关助力 ... ·  2 天前  
字节跳动技术团队  ·  稀土掘金 x Trae ... ·  2 天前  
51好读  ›  专栏  ›  聊聊架构

面试题:如何理解“UNIX里一切都是文件”这句话?

聊聊架构  · 公众号  · 架构  · 2018-07-30 20:38

正文

请到「今天看啥」查看全文


存储在磁盘上的文档、目录、链接、大容量存储设备(如磁盘驱动器、CD-ROM、磁带、USB)、进程间通信(例如管道、共享内存、UNIX 套接字)、网络连接、交互式终端、其他设备(如打印机、图形卡)。用户可以对这些字节流进行读(read)、写(write)、随机访问(lseek)和关闭(close)操作。

统一的 API 对于 UNIX 程序来说非常重要:你可以尽情地开发一个处理文件的程序,却不需要知道文件内容究竟是来自哪里,它们可能保存在本地磁盘或网络某处的远程驱动器上,或者是通过网络流入、由用户输入,甚至是由另一个程序在内存中生成。这大大降低了程序的复杂性,并简化了开发人员的学习曲线。这一基本特性让程序开发变得轻而易举(你只需与两个特殊文件打交道:标准输入和标准输出)。

不过需要注意的是,虽然所有文件都提供了统一的 API,但某些特定类型的设备可能不支持某些操作。例如,你无法对鼠标设备进行 lseek 操作,也无法在 CD-ROM 设备上进行 write 操作(假设你的 CD 是只读的)。

在 UNIX 中,文件系统是统一的命名空间

在 UNIX 中,文件不只是具有统一 API 的字节流,还可以通过统一的方式来引用它们:文件系统就是统一的命名空间。

全局命名空间和挂载机制

UNIX 的文件系统路径提供了统一的模式来标记资源,无论其性质如何。例如,你可以使用 /usr/local 引用本地目录,使用 /home/joe/memo.pdf 引用一个文件,使用 /mnt/cdrom 引用 CD-ROM,使用 /usr 引用网络驱动器上的目录,使用 /dev/sda1 引用一个磁盘分区,使用 /tmp/mysql.sock 引用 UNIX 域套接字,使用 /dev/tty0 引用终端,或使用 /dev/mouse 引用鼠标。这个全局命名空间通常被视为文件和目录的层次结构。文件路径可以引用几乎任何东西:文件系统、设备、网络共享或通信通道。

命名空间是分层的,所有资源可以从根目录(/)开始引用。你可以访问同一命名空间内的多个文件系统:只需要将其他设备或文件系统(如外部磁盘驱动器)“附加”到命名空间的某个位置(如 /backups)。在 UNIX 术语中,这个操作叫作挂载(mount)文件系统,而挂载文件系统的位置称为挂载点(mount point)。你可以将挂载文件系统里的所有资源视为全局命名空间的一部分,只要在访问这些资源时使用挂载点作为前缀(例如 /backups/myproject-Oct07.zip)。







请到「今天看啥」查看全文