跳至主要內容

Linux 中"一切皆文件"是什么意思?

程序员小富大约 5 分钟

Linux 中"一切皆文件"是什么意思?

题主理解岔了。"一切皆文件"跟"可执行程序是二进制文件"是两回事。Windows 的可执行程序当然也是二进制文件,这不是 Linux 的特殊之处。

"一切皆文件"说的是 Linux 操作系统的一个设计哲学:它把几乎所有东西都抽象成文件的形式来让你操作。不只是你硬盘上存的文档、代码、图片是文件,你的硬件设备、正在运行的进程、网络连接、甚至系统内核的运行状态,在 Linux 里都被表示成"文件",你可以用读写文件的方式去跟它们打交道。


举几个具体的例子就明白了

你的硬盘在 Linux 里是一个文件。比如 /dev/sda 就代表你的第一块硬盘。你甚至可以用 cat /dev/sda 去读它(虽然读出来是一堆乱码的原始二进制数据)。你的 U 盘插进来可能是 /dev/sdb,你的键盘是 /dev/input/event0 之类的。

这在 Windows 里不是这样的。Windows 里硬盘是"磁盘管理器"里的一个设备,你要操作它得用专门的 API 或者专门的工具。你不能像打开一个文本文件那样打开一块硬盘。

再看进程。Linux 里有一个 /proc 目录,每个正在运行的进程在里面都有一个以进程 ID 命名的子目录。比如进程号是 1234 的进程,它的信息就在 /proc/1234/ 下面:

cat /proc/1234/status    # 查看进程状态(名称、PID、内存占用等)
cat /proc/1234/cmdline   # 查看进程启动时的命令行参数
ls -l /proc/1234/fd/     # 查看进程打开了哪些文件
cat /proc/1234/maps      # 查看进程的内存映射

你不需要什么"任务管理器",直接读文件就能拿到进程的所有信息。

再比如系统信息。想知道 CPU 是什么型号、几个核心?

cat /proc/cpuinfo

想知道内存用了多少?

cat /proc/meminfo

想知道系统运行了多久?

cat /proc/uptime

全是读文件。不需要调什么特殊的系统 API,不需要装什么监控工具,cat 一下就出来了。


这个设计到底好在哪

好处在于统一。

在 Windows 里,你要获取进程信息得调 Windows 的进程管理 API,要操作硬件设备得调设备驱动的 API,要读网络状态得调网络相关的 API。每种资源有自己的一套接口,你得分别学。

Linux 把这些全抽象成文件之后,你只需要会一种操作:读文件和写文件。openreadwriteclose 这四个系统调用,几乎可以操作系统里的一切资源。

这对编程来说非常方便。你想写一个程序监控 CPU 温度,不需要去找什么硬件监控的 SDK,直接读 /sys/class/thermal/thermal_zone0/temp 这个文件就行:

cat /sys/class/thermal/thermal_zone0/temp
# 输出: 45000(代表 45.0°C)

在你的程序里就是打开文件、读内容、关闭文件,几行代码的事。

对运维来说也方便。你 SSH 登录到一台远程服务器上,不用装任何额外的工具,用 catlsecho 这些最基本的命令就能获取系统的各种状态信息。因为所有信息都是文件,而操作文件的工具每个 Linux 系统都自带。


再看几个更"离谱"的例子

随机数是文件。/dev/urandom 是一个永远读不完的文件,每次读出来的都是随机数据。你想生成一个随机密码:

head -c 16 /dev/urandom | base64

"空"是文件。/dev/null 是一个黑洞,你往里面写任何东西都会被丢弃。不想看命令的输出?

some_command > /dev/null 2>&1

"零"是文件。/dev/zero 是一个无限输出零字节的文件。想创建一个固定大小的空文件?

dd if=/dev/zero of=empty.img bs=1M count=100   # 创建 100MB 的空文件

终端本身也是文件。你正在打字的这个终端窗口,在 Linux 里可能是 /dev/pts/0。你开两个终端窗口,在一个里面执行:

echo "你好" > /dev/pts/1

另一个终端窗口里就会出现"你好"。你是通过写文件的方式把文字发到了另一个终端上。


它不是字面意义上的"文件"

这里需要澄清一点,免得产生误解。

/proc/cpuinfo 或者 /dev/sda 并不是真的存在于你硬盘上的文件。你的硬盘上不会有一个叫 cpuinfo 的文件存着 CPU 信息。这些是虚拟文件系统(VFS)提供的接口——内核把系统信息和设备状态"伪装"成了文件的样子。当你读 /proc/cpuinfo 的时候,实际上是内核在那一刻去收集 CPU 的信息然后返回给你。

所以"一切皆文件"更准确的说法应该是:Linux 把一切资源都抽象成了文件的接口。你用操作文件的方式来操作它们,但它们底层的实现各不相同。

这种设计的本质是统一接口。不管底层是硬盘、网卡、进程还是 CPU 温度传感器,对上层的应用程序来说,操作方式都是一样的:打开、读写、关闭。你学会了操作文件,就等于学会了操作 Linux 系统里的几乎所有东西。


回到题主的问题

"Linux 下一切可执行程序是二进制文件"这个说法本身也不完全对。Linux 下的可执行文件有两种:编译后的二进制文件(ELF 格式,类似 Windows 的 .exe),以及脚本文件(Shell 脚本、Python 脚本等,本质是文本文件,通过解释器执行)。

但不管哪种,跟"一切皆文件"都没关系。"一切皆文件"说的不是"所有东西都是文件格式存储的",而是"所有东西都可以用文件的方式来操作"。

这两个概念差别很大。前者是存储格式的问题,后者是操作系统设计哲学的问题。

上次编辑于: