文件描述符/文件句柄/文件指针的区别与联系

文件描述符、文件句柄、文件指针这三个概念很容易混淆,网上其他博客也是众说纷纭。于是做了一点考证,专门写一篇来尽量准确地记录下。

进程级别的文件描述符 & 文件描述符表

文件描述符

文件描述符(file descriptor, fd)是Linux系统中对已打开文件的一个抽象标记,所有I/O系统调用对已打开文件的操作都要用到它。这里的“文件”仍然是广义的,即除了普通文件和目录外,还包括管道、FIFO(命名管道)、Socket、终端、设备等。

文件描述符是一个较小的非负整数,并且0、1、2三个描述符总是默认分配给标准输入、标准输出和标准错误。这就是常用的nohup ./my_script > my_script.log 2>&1 &命令里2和1的由来。

文件描述符/文件句柄/文件指针的区别与联系

文件描述符表

Linux系统中的每个进程会在其进程控制块(PCB)内维护属于自己的文件描述符表(file descriptor table)。表中每个条目包含两个域:一是控制该描述符的标记域(flags),二是指向系统级别的打开文件表中对应条目的指针。那么打开文件表又是什么呢?