核心解答
文件描述符(File Descriptor, FD) 是 Unix/Linux 系统中用于指代被打开文件的 非负整数。
它是内核为了高效管理已被打开的文件所创建的索引。在 Linux 的世界里,“一切皆文件”(包括普通文件、目录、管道、网络套接字、硬件设备等),所有对这些资源的操作(读、写、关闭)都是通过文件描述符来完成的。
解答思路
理解文件描述符可以遵循从“用户态”到“内核态”的逻辑链条:
- 进程视角:每个进程都有一个“账本”(文件描述符表)。
- 内核索引:FD 只是这个账本上的行号(索引)。
- 资源映射:通过这个行号,内核能找到真正的文件对象(File Object)和底层资源。
深度解析与面试技巧
每个进程启动时,默认会打开三个文件描述符:
0: 标准输入 (stdin)
1: 标准输出 (stdout)
2: 标准错误 (stderr)
- 上限限制:系统对单个进程能打开的 FD 数量有限制(可通过
ulimit -n 查看)。
- 资源泄露:如果程序打开文件或 Socket 后忘记调用
close(),FD 就会被耗尽,导致后续的 open 或 accept 操作失败(报错:Too many open files)。
- 追问方向:面试官可能会接着问 select、poll 和 epoll 的区别(因为它们都涉及对大量 FD 的监听),或者问“FD 和文件指针
FILE* 的区别”。
- 避坑指南:不要简单地说 FD 就是“文件”。要强调它是内核管理资源的索引,是进程与内核交互的句柄。