news 2026/7/14 22:26:40

Linux 文件描述符(File Descriptor, FD)详解

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Linux 文件描述符(File Descriptor, FD)详解

文件描述符(File Descriptor, FD)

文件描述符是操作系统为进程管理打开文件/资源分配的整数句柄。它是Unix/Linux系统中所有I/O操作的核心抽象

核心概念

1.本质是什么?

  • 一个非负整数(0, 1, 2, 3, …)
  • 指向内核维护的打开文件表的索引
  • 进程级别的资源标识符

2.三个标准文件描述符

0- stdin(标准输入)1- stdout(标准输出)2- stderr(标准错误)

如何工作?

内核中的数据结构关系

进程A 内核 ├── 文件描述符表 ├── 系统级打开文件表 │ fd 0 → 条目1 │ 条目1 → 文件信息1 │ fd 1 → 条目2 │ 条目2 → 文件信息2 │ fd 4 → 条目3 │ 条目3 → 文件信息3 └── └──

实际例子

// 打开文件时获取文件描述符intfd=open("file.txt",O_RDONLY);// fd 可能是 3(如果 0,1,2 已被占用)// 通过 fd 进行读写read(fd,buffer,size);write(fd,buffer,size);// 完成后关闭close(fd);

文件描述符可以指向什么?

不仅仅是文件!可以是任何I/O资源

资源类型例子如何创建
普通文件/etc/passwdopen()
目录/home/useropendir()
网络套接字TCP/UDP连接socket()
管道进程间通信pipe()
设备文件/dev/tty,/dev/nullopen()
符号链接软链接文件open()

查看文件描述符

在进程中查看

# 查看当前shell的文件描述符ls-la /proc/$$/fd# 输出示例:# lrwx------ 1 user user 64 Dec 10 10:00 0 -> /dev/pts/0# lrwx------ 1 user user 64 Dec 10 10:00 1 -> /dev/pts/0# lrwx------ 1 user user 64 Dec 10 10:00 2 -> /dev/pts/0# lr-x------ 1 user user 64 Dec 10 10:00 3 -> /etc/passwd

查看进程打开的文件描述符

# 使用 lsof 查看lsof-p<PID># 使用 /procls-la /proc/<PID>/fd/cat/proc/<PID>/fdinfo/3# 查看 fd 3 的详细信息

文件描述符的特性

1. 继承性

# 子进程继承父进程的文件描述符# 这就是为什么重定向能在管道中工作:ls-l|greptxt2>errors.log# grep 继承了 ls 的 stdout 和 stderr

2. 引用计数

// 多个描述符可以指向同一个文件intfd1=open("file.txt",O_RDONLY);// refcount = 1intfd2=dup(fd1);// refcount = 2close(fd1);// refcount = 1close(fd2);// refcount = 0 → 文件真正关闭

3. 文件描述符表 vs 打开文件表

进程A 进程B fd3 ----\-->系统打开文件表条目1 -->实际文件 fd2 ----/

实际应用场景

1. 重定向

# 将 stdout (fd 1) 重定向到文件exec1>output.logecho"这会写入文件"# 将 stderr (fd 2) 重定向到 stdoutcommand2>&1# 创建自定义文件描述符exec3<>/tmp/socket# 打开 fd 3 用于读写echo"data">&3# 写入 fd 3readline<&3# 从 fd 3 读取

2. 网络编程

// socket() 返回的也是一个文件描述符!intsock_fd=socket(AF_INET,SOCK_STREAM,0);connect(sock_fd,...);// 使用 fd 连接send(sock_fd,data,...);// 使用 fd 发送recv(sock_fd,buffer,...);// 使用 fd 接收

3. 进程间通信

intpipe_fd[2];pipe(pipe_fd);// pipe_fd[0] 用于读,pipe_fd[1] 用于写if(fork()==0){// 子进程:关闭读端,写入数据close(pipe_fd[0]);write(pipe_fd[1],"Hello",6);}

限制和配置

查看限制

# 查看单个进程最大文件描述符数ulimit-n# 查看系统全局限制cat/proc/sys/fs/file-max# 查看当前已使用的文件描述符数cat/proc/sys/fs/file-nr# 输出:已分配 已使用 最大值

修改限制

# 临时修改ulimit-n65536# 永久修改(系统级)echo"fs.file-max = 1000000">>/etc/sysctl.conf sysctl -p# 用户级限制# 编辑 /etc/security/limits.conf# * soft nofile 65536# * hard nofile 65536

常见问题

“Too many open files” 错误

# 原因:文件描述符耗尽# 查看某个进程打开的文件数ls/proc/<PID>/fd|wc-l# 解决方案:# 1. 增加系统限制# 2. 检查程序是否有文件泄露(未关闭)

文件描述符泄露检测

# 使用 lsof 监控watch-n1'lsof -p <PID> | wc -l'# 使用 /proc 监控watch-n1'ls /proc/<PID>/fd | wc -l'

总结

文件描述符的核心价值

  1. 统一抽象:所有I/O资源(文件、网络、管道)都用 fd 表示
  2. 简单接口:只需read()write()close()几个系统调用
  3. 高效管理:内核统一管理,用户态只用整数操作
  4. 资源控制:通过限制 fd 数量,控制资源使用

正是因为文件描述符的存在,Unix/Linux 才能实现"一切皆文件"的哲学,让复杂的I/O操作变得简单统一。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/29 16:17:22

CP针是否能压到bumping后凸块决定性因素

bumping后的凸块的平整度&#xff08;高低点最大距离&#xff09;针的平整度&#xff08;高低点最大距离&#xff09;针的弹性单边幅度要满足弹性>bumping后的凸块的平整度针的平整度

作者头像 李华
网站建设 2026/7/1 6:46:47

GB/Z167-2025《系统控制图》全维度解析

GB/Z167-2025《系统控制图》是 2025 年 12 月 3 日发布的国家标准化指导性技术文件&#xff0c;适用于过程工业连续控制系统&#xff08;如石油、天然气工艺过程&#xff09;的设计与管理。其核心价值在于建立统一的操作控制功能定义和逻辑图规范&#xff0c;填补了传统 P&…

作者头像 李华
网站建设 2026/7/3 22:15:12

针对论文降重与AI写作需求,目前市面上有8款热门网站提供高效改写与创作功能。

AI论文工具种类繁多&#xff0c;如何挑选符合自身需求的平台成为关键。通过对8款主流工具的实测分析&#xff0c;从降重效果、AIGC率优化及论文撰写能力等维度展开对比&#xff0c;综合效率、准确度与操作便捷性进行客观评估。以下为基于实际测试与用户评价的实用工具排行摘要。…

作者头像 李华
网站建设 2026/7/5 1:46:43

QLoRA量化微调实战

&#x1f493; 博客主页&#xff1a;借口的CSDN主页 ⏩ 文章专栏&#xff1a;《热点资讯》 QLoRA量化微调实战&#xff1a;资源受限环境下的高效模型优化目录QLoRA量化微调实战&#xff1a;资源受限环境下的高效模型优化 引言&#xff1a;为什么QLoRA成为微调新范式 一、QLoRA技…

作者头像 李华
网站建设 2026/7/11 21:27:28

一眼读懂中国7大地理区域,你的家乡在哪个板块?

从白山黑水到南海之滨&#xff0c;从雪域高原到江南水乡&#xff0c;中国 960 万平方公里的土地上&#xff0c;地理风貌、人文风情千差万别。为了更清晰地梳理这片土地的地理脉络&#xff0c;地理学界将全国划分为 7 大地理区域&#xff0c;每个区域都有着独特的自然禀赋、经济…

作者头像 李华
网站建设 2026/7/2 12:30:16

1700RZ14005A电路板控制器

1700RZ14005A 电路板控制器型号: 1700RZ14005A 类型: 控制器 / 控制电路板 适用系统: 工业自动化控制系统&#xff08;如 Taylor MOD 系列&#xff09;基本介绍1700RZ14005A 是工业控制系统中的 控制器模块&#xff0c;安装在控制机柜的背板或机箱中。它负责接收输入信号、执行…

作者头像 李华