档案描述符的魔法:如何在 Unix 系统中轻松操作文件和资源?

在 Unix 和类 Unix 操作系统中,档案描述符(FD)作为一种独特的识别符,用来标识文件或其他输入/输出资源。它们使系统中的文件操作变得更加方便和灵活。

档案描述符通常由一个非负整数值组成,负值则被保留用以指示「没有值」或错误条件。

每个 Unix 过程至少会有三个标准的 POSIX 档案描述符,分别对应于三个标准流:标准输入、标准输出和标准错误。这种设计不仅影响了程序的性能,还影响了用户的操作方式。

在传统的 Unix 实现中,档案描述符是指向一个由内核维护的每个过程的档案描述符表的索引,这又索引到一个系统范围的由所有过程开启的文件表中。这个表记录了文件的打开模式:读取、写入、附加,甚至可能有其他模式。

为了执行输入或输出,过程将档案描述符通过系统调用传递给内核,内核将会代表过程访问文件。

因此,过程并不直接访问文件或 inode 表。在 Linux 系统中,过程打开的档案描述符可以通过路径 /proc/PID/fd/ 访问,其中 PID 是过程识别符。每个档案描述符分别代表标准输入(/proc/PID/fd/0)、标准输出(/proc/PID/fd/1)和标准错误( /proc/PID/fd/2)。

在 Unix 类系统中,档案描述符可以指向文件系统中命名的任何 Unix 文件类型。这不仅包括常规文件,还包括目录、块设备和字符设备(也称为「特殊文件」)、Unix 域套接字和命名管道。档案描述符还可以参考其他通常不在文件系统中存在的对象,如匿名管道和网络套接字。

在 C 标准 I/O 库中,FILE 数据结构通常包括所涉及对象的低级档案描述符。

这意味着复杂的抽象和底层操作已经被封装进入了更加易于使用的接口中,这就是我们所说的档案句柄。

档案描述符的操作

以下是现代 Unix 类系统中针对档案描述符的一些典型操作。大多数这些函数在 <unistd.h> 标头中声明,但某些则在 <fcntl.h> 标头中。

创建档案描述符

开启档案描述符的几种方式包括:

  • open()
  • creat()
  • socket()
  • pipe()
  • 许多 Linux 特有的操作,如 epoll_create()

操作单一档案描述符

纠正或获取档案描述符的状态的各类函数包括:

  • read(), write()
  • fstat(), fchmod(), fchown()
  • fdopendir() (将档案描述符转换为目录流)

操作多个档案描述符

为了有效管理多个描述符,您可以使用:

  • select(), poll()
  • epoll_wait() (Linux)

这使得处理并发连接和事件成为可能。

修改过程状态的操作

例如:

  • fchdir() (根据目录档案描述符设置当前工作目录)
  • mmap() (将文件范围映射到过程的地址空间中)

档案锁定和套接字操作

Unix 系统还提供档案锁定和套接字操作的能力,包括:

  • flock()
  • connect(), bind()

档案描述符作为能力

档案描述符在许多方面类似于能力。通过 Unix 域套接字进行的 sendmsg() 系统调用允许描述符在过程之间进行传递,这为资源的安全共享提供了潜力。

但是,这种能力的安全性受到潜在可变状态的影响。

因为一旦程序共享同一档案描述符的访问,就可能会干扰彼此的使用,这使得使用档案描述符作为能力变得复杂。

随着 UNIX 系统不断演化,许多新操作也在被标准化,以提供更好的保护和灵活性。

作为使用者,您是否曾经想过档案描述符对于过程管理和数据流控制的真正影响是什么呢?

Trending Knowledge

Unix 系统中的神秘世界:如何使用 epoll 和 kqueue 管理大量档案描述符?
在 UNIX 和 UNIX-like 作业系统中,档案描述符 (File Descriptor, FD) 是一个用于标识档案或其他输入/输出资源(如管道或网路套接字)的过程唯一标识符。这些档案描述符的值通常为非负整数,负值用来指示“没有值”或错误条件。档案描述符是 POSIX API 的一部分,每个 UNIX 过程(除了一些守护进程)应有三个标准的 POSIX 档案描述符
从进程到内核:Unix 档案描述符如何变身为你的最佳助手?
在Unix和类Unix的操作系统中,档案描述符是进程唯一的标识符,专门用来处理档案或其他输入/输出资源,如管道或网络套接字。这些档案描述符通常为非负整数值,负值则用来表示「无值」或错误条件。这项技术已成为POSIX API的一部分,对于每个Unix进程来说,除了某些守护进程之外,都应拥有三个标准POSIX档案描述符,这三个档案描述符分别对应于标准输入、标准输出和标准错误流。
Unix 档案描述符揭秘:为什么标准输入、标准输出和标准错误如此关键?
在 Unix 和类 Unix 操作系统中,档案描述符(FD)是每个进程的唯一识别码,用于识别档案或其他输入/输出资源,如管道或网路套接字。这些描述符通常使用非负整数值,大多数情况下,负值则表示「无值」或错误条件。档案描述符是POSIX API 的一部分,所有Unix 进程通常都需要三个标准的POSIX 档案描述符,这些描述符对应于三个标准流:标准输入(stdin)、标准输出(stdout)和标准错

Responses