面试知识库
基础

文件描述符#

一句话答案#

文件描述符是内核为每个打开文件/Socket 分配的非负整数索引(0=stdin/1=stdout/2=stderr),是进程访问 IO 的句柄。

核心要点

标准fd: 0(stdin) / 1(stdout) / 2(stderr)

限制: ulimit -n 查看/设置单进程最大 fd 数(默认1024,生产需调大)

与网络编程: 每个 Socket 连接占一个 fd,epoll 监听 fd 的就绪事件

面试回答(2分钟版)

文件描述符是内核为每个进程打开的文件或Socket分配的一个非负整数索引,是进程访问IO资源的句柄。每个进程默认有三个标准fd:0是stdin、1是stdout、2是stderr。在Linux中”一切皆文件”,Socket连接也是通过fd来操作的,每建立一个TCP连接就会消耗一个fd。fd的数量有上限,可以通过ulimit -n查看,默认通常是1024,对于高并发服务器来说远远不够,生产环境一般需要调到几十万。如果fd耗尽,新的连接和文件打开操作都会失败报”Too many open files”错误。fd和epoll的关系非常密切,epoll就是监听fd的就绪事件来实现IO多路复用的,当某个fd上有可读或可写事件时epoll会通知应用程序去处理。实际运维中fd泄漏是一个常见问题,比如打开文件或建立连接后没有正确关闭,可以通过lsof -p pid或者查看/proc/pid/fd来排查进程打开了哪些fd。

追问与易错

追问方向:

  • “fd 耗尽会怎样?”→ 新的连接和文件打开都会失败报 “Too many open files” 错误,服务不可用;通过 lsof -p PID 排查 fd 泄漏
  • “怎么调大 fd 限制?”→ 临时用 ulimit -n 65535,永久改 /etc/security/limits.conf 设置 nofile,系统级上限改 /proc/sys/fs/file-max
  • “socket 和 fd 关系?”→ 每个 socket 连接在内核中都表现为一个 fd,TCP 连接建立后 accept 返回新 fd,epoll 就是监听这些 socket fd 的就绪事件

易错点:

  • ❌ 默认 1024 个 fd 够用——高并发需调到几十万
  • ❌ fd 和 inode 一样——fd 是进程级索引