在linux系统中,fd是file descriptor的缩写,中文通常称为文件描述符。它是内核为了管理进程打开的文件、管道、 socket 等资源而分配的一个非负整数。简单来说,当我们在linux下打开一个文件或者建立一个网络连接,内核就会返回一个数字,后续读写操作都靠这个数字来定位资源。

linux fd的基本概念
linux遵循一切皆文件的思想,普通文件、目录、设备、管道、网络套接字在进程看来都抽象成文件。进程通过文件描述符来引用这些对象。每个进程都有自己的文件描述符表,表中每一项指向内核维护的打开文件表。
标准文件描述符
每个linux进程启动时默认打开三个fd:
- 0:标准输入 stdin
- 1:标准输出 stdout
- 2:标准错误 stderr
fd的分配规则
内核总是分配当前可用的最小非负整数作为新的文件描述符。例如关闭了1,再打开新文件就会得到1。可以用如下c代码观察:
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
int main() {
// 打开一个文件,返回fd
int fd = open("test.txt", O_CREAT | O_WRONLY, 0644);
printf("open fd = %dn", fd);
// 关闭标准输出
close(1);
// 再次打开,应该分配到1
int fd2 = open("out.txt", O_CREAT | O_WRONLY, 0644);
printf("after close 1, fd2 = %dn", fd2);
return 0;
}
常用系统调用
操作fd的常用linux系统调用包括 open、read、write、close、dup、dup2 等。下面用表格列出作用:
| 函数 | 作用 |
|---|---|
| open | 打开文件返回fd |
| read | 从fd读取数据 |
| write | 向fd写入数据 |
| close | 关闭fd释放资源 |
| dup2 | 复制fd实现重定向 |
使用dup2实现重定向
下面的shell风格示例展示如何用c把输出重定向到文件:
#include <fcntl.h>
#include <unistd.h>
int main() {
int fd = open("log.txt", O_CREAT | O_WRONLY | O_TRUNC, 0644);
// 把fd复制到1,即标准输出
dup2(fd, 1);
write(1, "hello fdn", 9);
close(fd);
return 0;
}
查看进程fd
在linux中,可以通过 /proc 文件系统查看某个进程的fd。假设进程pid为1234,执行:
ls -l /proc/1234/fd
该目录下的数字文件就是该进程当前打开的文件描述符,链接指向实际资源。
小结
linux fd是进程与内核交互资源的整数句柄,理解它有助于掌握重定向、管道和网络编程。记住标准fd、分配规则和常用系统调用,就能在日常开发和排错中轻松应对。