在 Linux 系统中,fd 是 File Descriptor(文件描述符) 的缩写,它是操作系统用于管理文件和 I/O 资源的核心概念之一。以下是详细解释:
0
、1
、2
...),是进程访问文件、管道、套接字等 I/O 资源的抽象句柄。Linux 为每个进程自动分配 3 个标准 fd:
- 0 (STDIN
):标准输入(键盘输入)。
- 1 (STDOUT
):标准输出(终端输出)。
- 2 (STDERR
):标准错误(终端错误输出)。
open()
系统调用返回一个 fd,后续用 read()
/write()
操作。
c
int fd = open("file.txt", O_RDONLY); // 返回 fd(如 3)
c
int sockfd = socket(AF_INET, SOCK_STREAM, 0); // 返回 fd(如 4)
pipe()
调用返回两个 fd(读端和写端)。通过 /proc
文件系统查看某个进程(如 PID=1234)的 fd 列表:
ls -l /proc/1234/fd
输出示例:
lrwx------ 1 user user 64 Jan 1 10:00 0 -> /dev/pts/0 # 标准输入
lrwx------ 1 user user 64 Jan 1 10:00 1 -> /dev/pts/0 # 标准输出
lrwx------ 1 user user 64 Jan 1 10:00 2 -> /dev/pts/0 # 标准错误
lrwx------ 1 user user 64 Jan 1 10:00 3 -> /var/log/app.log # 打开的文件
cat /proc/sys/fs/file-max
查看全局最大 fd 数量。ulimit -n
查看当前用户的进程 fd 限制。bash
ulimit -n 65535 # 临时修改
# 永久修改需编辑 /etc/security/limits.conf
ulimit -n 65535
。close(fd)
)。lsof
查看未释放的 fd:
bash
lsof -p <PID> | grep "deleted" # 查找被删除但仍被占用的文件
文件描述符是 Linux 进程管理 I/O 资源的关键抽象,理解其原理和限制对系统编程、性能调优和故障排查至关重要。