「一切皆文件」这句话,你大概率是听过的。
但真要你讲清楚它到底在说什么,多数人只能说出「硬盘是文件、键盘是文件」这种表层比喻。
它真正的重心不在「什么东西是文件」,而在于 Linux 怎么用同一套接口去操作这些东西。

文件在 Linux 眼里到底是什么
平时你眼里的文件,是文档、图片、视频这些躺在磁盘上的东西。
Linux 把这件事放大了。
它背后的核心思想是:
很多不同类型的资源,都可以通过统一的文件接口来访问。
普通文件、设备、管道等资源,程序往往可以通过文件描述符和 read、write、close 等接口进行操作;
Socket 则通过 socket 创建,同样会得到文件描述符。
这就像墙上的标准插座。
电视、冰箱、台灯的插头长得不一样,但插进墙里取电这件事是统一的。
Linux 干的就是把硬盘、键盘、打印机都接上同一个「插座」,操作它们的方式差不多。
举个最实在的例子:硬盘
Linux 会把磁盘这类硬件暴露成设备文件,比如 /dev/sda。
不过普通程序保存文件时,通常不会直接去操作 /dev/sda。
它写的是普通文件,再由内核和文件系统把数据最终落到磁盘设备上。
你根本不用管底下是 SATA 还是 NVMe,是机械盘还是固态盘,接口长一个样。
键盘和打印机也一样
键盘输入也能通过文件接口被程序读取。
但这里要纠正一个常见的误解:
/dev/tty 并不等于「键盘设备」。
它指的是当前进程关联的控制终端。
你敲下键盘后,输入事件要经过 Linux 的输入子系统和终端驱动处理,程序最终通过标准输入或终端设备读到这些数据。
打印机也有相应的设备接口,但现代 Linux 中,应用通常通过 CUPS 等打印系统完成打印,而不是直接 write 到设备文件。
这种抽象的威力在于,你不用给硬盘、键盘、打印机各学一套完全不同的操作方式,很多场景走的思路是统一的。
统一接口到底香在哪
好处最容易看到的,是命令行。
统一接口的好处,并不是所有资源都能拿 cp 随便操作,而是很多不同类型的资源,都可以通过类似的文件描述符和 I/O 机制来读写。
普通文件、管道、终端、套接字,程序都能用相对统一的方式处理数据。
更典型的例子是重定向和管道。
命令的输出,本质上是写进「标准输出」这个文件描述符。
你可以把它重定向到普通文件,也可以通过管道交给下一个程序继续处理。
命令 A
↓
pipe
↓
命令 B
数据的流动方式因此能被组合起来,这也是 Linux 命令行灵活的原因。

不同类型的资源,在 Linux 里的常见访问方式,摊开看长这样:
代码层面看,把终端敲出来的内容存成文件,就是一条命令的事:
# 把终端输入保存到文件,按 Ctrl + D 结束
cat > what_i_typed.txt

一句话看清本质
说到这,一切皆文件的事就算讲透了。
「一切皆文件」真正想表达的,并不是 Linux 里所有东西都真的等同于普通文件。
更重要的是,Linux 会尽可能把不同类型的资源,都纳入统一的 I/O 模型里。
普通文件、设备、管道、Socket,程序通常都可以通过文件描述符,以及 read、write 这些统一接口来处理数据。
不同资源底层实现完全不同,但程序跟它们交互的方式可以尽量保持一致。
这才是「一切皆文件」最核心的思想。