跳到内容

第 0 卷 / 第 1 章 / 第 2 课

1.2 程序与文件 ​

前置知识:计算机的基本构造

预计时间:8–12 分钟

完成标志:能解释文件、路径和程序的关系,并识别本机一个可执行文件的格式

程序文件可以保存、复制和分发,却不会自行执行。它只记录机器或解释器需要读取的字节;要分清程序和进程,先得把“文件”说准确。

文件不等于“名字加内容” ​

普通文件包含字节和元数据。元数据常见有大小、权限、所有者和时间戳。路径让程序找到文件,路径文字不属于文件内容。

在 Unix 文件系统中,目录项把名字关联到文件对象。同一个文件对象可以有多个硬链接名字:

bash
workdir=$(mktemp -d)
printf 'atlas\n' > "$workdir/original.txt"
ln "$workdir/original.txt" "$workdir/second-name.txt"
ls -li "$workdir/original.txt" "$workdir/second-name.txt"
rm -rf "$workdir"

类型: runnable环境: Linux 或 macOS、Bash 观察: 两行的 inode 编号相同,说明同一文件系统中的两个名字指向同一个文件对象。硬链接不能跨文件系统建立;不同文件系统中碰巧相同的 inode 编号不说明是同一文件。Windows 的 NTFS 也支持硬链接,但命令和权限不同。

“一切皆文件”是 Unix 的接口风格:设备、管道和部分进程信息可以通过类似文件的接口访问。进程、网络连接和窗口并没有因此变成普通磁盘文件。

程序可能跨越多个文件 ​

程序包含可执行指令和相关数据。它可能是:

  • ELF、PE 或 Mach-O 等本机可执行文件;
  • 由 Bash、Python 等解释器读取的脚本;
  • Java 字节码、JAR、共享库、配置和资源组成的一套文件;
  • macOS 应用包或安装目录。

因此,“程序就是一个机器码文件”只覆盖一部分程序。

查看文件格式 ​

bash
file -L /bin/ls
file -L "$(command -v python3)"

类型: runnable环境: Linux 或安装了 file 的 macOS 观察: -L 会跟随符号链接再判断目标格式。Linux 常见 ELF,macOS 常见 Mach-O;架构、动态链接器和调试符号信息以本机为准。

Windows PowerShell 可以先运行:

powershell
Get-Command python | Format-List Source,CommandType

这能找到命令来源,不能完整解析 PE 文件结构。不要把 Linux 的 ELF 输出当作跨平台预期结果。

把三件事说清楚 ​

离开这一页前,试着向别人解释:路径怎样找到文件,文件内容与元数据有什么区别,以及 Python 脚本为什么能参与程序执行却不是 CPU 直接读取的本机指令。最后把 file -L 对 python3 的描述保存下来,下一页还会用到它。

进程与内存会让这份静止的程序真正运行起来。

参考资料 ​

Built with VitePress | Software Systems Atlas