1.2 程序与文件
前置知识:计算机的基本构造
预计时间:8–12 分钟
完成标志:能解释文件、路径和程序的关系,并识别本机一个可执行文件的格式
程序文件可以保存、复制和分发,却不会自行执行。它只记录机器或解释器需要读取的字节;要分清程序和进程,先得把“文件”说准确。
文件不等于“名字加内容”
普通文件包含字节和元数据。元数据常见有大小、权限、所有者和时间戳。路径让程序找到文件,路径文字不属于文件内容。
在 Unix 文件系统中,目录项把名字关联到文件对象。同一个文件对象可以有多个硬链接名字:
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 应用包或安装目录。
因此,“程序就是一个机器码文件”只覆盖一部分程序。
查看文件格式
file -L /bin/ls
file -L "$(command -v python3)"类型: runnable环境: Linux 或安装了 file 的 macOS 观察: -L 会跟随符号链接再判断目标格式。Linux 常见 ELF,macOS 常见 Mach-O;架构、动态链接器和调试符号信息以本机为准。
Windows PowerShell 可以先运行:
Get-Command python | Format-List Source,CommandType这能找到命令来源,不能完整解析 PE 文件结构。不要把 Linux 的 ELF 输出当作跨平台预期结果。
把三件事说清楚
离开这一页前,试着向别人解释:路径怎样找到文件,文件内容与元数据有什么区别,以及 Python 脚本为什么能参与程序执行却不是 CPU 直接读取的本机指令。最后把 file -L 对 python3 的描述保存下来,下一页还会用到它。
进程与内存会让这份静止的程序真正运行起来。