文件描述符fd
2026/8/25大约 2 分钟
Linux 文件描述符:fd
1. fd 是什么
Linux 中,文件、设备、Socket、Pipe 等资源,都可以通过一个整数访问。
这个整数就是:
文件描述符(File Descriptor,fd)。
例如:
int fd = open("test.txt", O_RDONLY);返回:
fd = 3之后:
read(fd, buf, len);
close(fd);就是通过 fd 找到对应资源。
fd 本质上是进程文件描述符表中的索引。
2. 每个进程都有自己的 fd 表
进程
↓
文件描述符表
0 → stdin
1 → stdout
2 → stderr
3 → test.txt
4 → socket
5 → pipefd = 3 并不是“文件编号 3”,而是:
在当前进程的 fd 表中,通过索引 3 找到对应的打开对象。
3. 0、1、2
进程启动时通常已经有:
0 → stdin 标准输入
1 → stdout 标准输出
2 → stderr 标准错误因此第一次 open() 通常从 3 开始。
int fd = open("test.txt", O_RDONLY);Linux 通常返回:
3因为 open() 通常返回当前进程最小的可用 fd。
4. Socket 和 Pipe 也是 fd
int fd = socket(AF_INET, SOCK_STREAM, 0);得到一个 fd。
int pipefd[2];
pipe(pipefd);得到两个 fd:
pipefd[0] → 读端
pipefd[1] → 写端所以:
文件
设备
Socket
Pipe
↓
都可以通过 fd 操作常见接口:
read()
write()
ioctl()
close()5. fd 的生命周期
open()
socket()
pipe()
↓
得到 fd
↓
read()/write()/ioctl()
↓
不用了
↓
close(fd)fd 的核心不是“创建”,而是:
创建 → 使用 → 释放。
6. fd 限制
进程级
查看:
ulimit -n表示:
当前进程最多允许打开多少个 fd。
也可以通过 getrlimit() / setrlimit() 查询和调整。
系统级
cat /proc/sys/fs/file-max表示:
整个系统允许存在的打开文件对象数量上限。
所以:
进程级 → 一个进程最多多少 fd
系统级 → 整个系统最多多少打开文件对象7. fd 泄漏
while (1) {
int fd = open("test.txt", O_RDONLY);
// 忘记 close(fd)
}结果:
3 → 4 → 5 → 6 → ...
↓
达到限制
↓
Too many open files所以嵌入式 Linux 中,长期运行的程序尤其要注意:
打开一个 fd,就必须明确它在哪里关闭。
查看进程当前 fd:
ls -l /proc/<PID>/fd统计数量:
ls /proc/<PID>/fd | wc -l8. 一句话记忆
fd = 进程文件描述符表的索引;
0/1/2是标准输入输出错误,open/socket/pipe都会产生 fd,使用完必须close(),否则可能导致 fd 泄漏。

