# 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命令创建一个目录,用ls查看其内容,用rmdir删除该目录。套接字(socket)是用来与另一个进程进行跨网络通信的文件(11.4 节)。
其他文件类型包含命名通道(named pipe)、符号链接(symbolic link),以及字符和块设备(character and block device),这些不在本书的讨论范围。
Linux 内核将所有文件都组织成一个目录层次结构(directory hierarchy),由名为 /(斜杠)的根目录确定。系统中的每个文件都是根目录的直接或间接的后代。图 10-1 显示了 Linux 系统的目录层次结构的一部分。

图 10-1 Linux 目录层次的一部分。尾部有斜杠表示是目录
作为其上下文的一部分,每个进程都有一个当前工作目录(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。