> For the complete documentation index, see [llms.txt](https://hansimov.gitbook.io/csapp/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://hansimov.gitbook.io/csapp/part3/ch10-system-level-io/10.2-files.md).

# 10.2 文件

每个 Linux 文件都有一个**类型**（type）来表明它在系统中的角色：

* **普通文件**（regular file）包含任意数据。应用程序常常要区分**文本文件**（text file）和**二进制文件**（binary file），文本文件是只含有 ASCII 或 Unicode 字符的普通文件；二进制文件是所有其他的文件。对内核而言，文本文件和二进制文件没有区别。

  Linux 文本文件包含了一个**文本行**（text line）序列，其中每一行都是一个字符序列，以一个新行符（“\n”）结束。新行符与 ASCII 的换行符（LF）是一样的，其数字值为 0x0a。
* **目录**（directory）是包含一组**链接**（link）的文件，其中每个链接都将一个**文件名**（filename）映射到一个文件，这个文件可能是另一个目录。每个目录至少含有两个条目：是到该目录自身的链接，以及是到目录层次结构（见下文）中**父目录**（parent directory）的链接。你可以用 mkdir 命令创建一个目录，用 Is 查看其内容，用 rmdir 删除该目录。
* **套接字**（socket）是用来与另一个进程进行跨网络通信的文件（11.4 节）。

其他文件类型包含**命名通道**（named pipe）、 **符号链接**（symbolic link），以及**字符和块设备**（character and block device），这些不在本书的讨论范畴。

Linux 内核将所有文件都组织成一个**目录层次结构**（directory hierarchy），由名为 /（斜杠）的**根目录**确定。系统中的每个文件都是根目录的直接或间接的后代。图 10-1 显示了 Linux 系统的目录层次结构的一部分。

![图 10-1 Linux 目录层次的一部分。尾部有斜杠表示是目录](/files/-MIZaJofE_PJ06O1n5c7)

作为其上下文的一部分，每个进程都有一个**当前工作目录**（current working directory）来确定其在目录层次结构中的当前位置。你可以用 cd 命令来修改 shell 中的当前工作目录。

目录层次结构中的位置用**路径名**（pathname）来指定。路径名是一个字符串，包括一个可选斜杠，其后紧跟一系列的文件名，文件名之间用斜杠分隔。路径名有两种形式：

* **绝对路径名**（absolute pathname）以一个斜杠开始，表示从根节点开始的路径。例如，在图 10-1 中，hello.c 的绝对路径名为 **/home/droh/hello.c**。
* **相对路径名**（relative pathname）以文件名开始，表示从当前工作目录开始的路径。例如，在图 10-1 中，如果 **/home/droh** 是当前工作目录，那么 **hello.c** 的相对路径名就是 **./hello.c**。反之，如果 **/home/bryant** 是当前工作目录，那么相对路径名就是 **../home/droh/hello.c**。
