当前位置: 首页 > news >正文

文件描述符介绍

文件描述符(File Descriptor,简称 fd) 是 Linux/Unix 系统编程中最核心的概念之一。简单来说,它是操作系统为了管理“打开的文件”而分配给进程的一个非负整数索引

在 Linux“一切皆文件”的设计哲学下,不仅普通文件,包括网络套接字(Socket)、管道(Pipe)、硬件设备等 I/O 资源,都是通过文件描述符来操作的。

📖 核心概念与本质

1. 它是什么?

从应用层看,fd 是一个简单的整数(如 0, 1, 2, 3...)。
从内核层看,它是进程控制块(task_struct)中文件表(files_struct)里的一个数组下标。这个数组(fd_array)的每个元素都指向内核中一个具体的 file 结构体,该结构体记录了文件的位置、权限和操作方法。

2. 三个标准文件描述符

当一个进程启动时,默认会打开三个文件描述符:

fd 值 名称 宏定义 默认设备 说明
0 标准输入 STDIN_FILENO 键盘 程序读取数据的入口
1 标准输出 STDOUT_FILENO 屏幕 程序输出正常结果的出口
2 标准错误 STDERR_FILENO 屏幕 程序输出错误信息的出口

⚙️ 底层原理与分配规则

  1. 分配规则:“最小可用下标”原则。当你打开一个新文件时,内核会在文件描述符表中寻找当前未被使用的最小非负整数进行分配。
    • 例子:如果你关闭了标准输入(fd 0),下一个打开的文件将会占用 fd 0。
  2. 生命周期:
    • 创建:通过 open()socket()pipe() 等系统调用创建,内核返回一个新的 fd。
    • 使用:通过 read()write() 等调用,传入 fd 进行操作。
    • 关闭:通过 close(fd) 释放。内核会减少对应文件对象的引用计数,若计数为 0 则真正释放资源。

🔍 如何查看与监控

在运维和调试中,我们经常需要查看进程打开了哪些文件描述符。

  1. 查看进程打开的 fd
    /proc 文件系统中,每个进程都有一个 fd 目录。

    ls -l /proc/<PID>/fd[root@nfs ~]#ls -l /proc/875/fd
    总用量 0
    lr-x------ 1 root root 64 4月   3 06:37 0 -> /dev/null
    lrwx------ 1 root root 64 4月   3 06:37 1 -> socket:[18206]
    lrwx------ 1 root root 64 4月   3 06:37 2 -> socket:[18206]
    lrwx------ 1 root root 64 4月   3 06:37 3 -> socket:[18233]
    lrwx------ 1 root root 64 4月   3 06:37 4 -> socket:[18242]

    这会列出该进程当前打开的所有文件描述符及其指向的文件。

  2. 使用 lsof 命令
    lsof (List Open Files) 是强大的系统工具,用于列出所有打开的文件及其对应的进程。

    # 查看特定进程打开的文件
    lsof -p <PID># 查看特定端口占用的 fd
    lsof -i :80[root@nfs ~]#lsof -i :22
    COMMAND   PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
    sshd      875 root    3u  IPv4  18233      0t0  TCP *:ssh (LISTEN)
    sshd      875 root    4u  IPv6  18242      0t0  TCP *:ssh (LISTEN)
    sshd    13272 root    3u  IPv4 239657      0t0  TCP nfs:ssh->10.0.0.1:31732 (ESTABLISHED)
http://www.jsqmd.com/news/587164/

相关文章:

  • 这是另一个测试
  • 如何通过SEO优化让网站排名首页_网站UX设计对SEO有什么影响
  • 如何高效配置无人机电子调速器:专业级ESC配置工具实战指南
  • RVC WebUI汉化与本地化:中文字体适配、路径中文兼容性解决方案
  • 说说不错的少儿学武术学校,登封嵩山少林精武学校靠谱吗? - 工业推荐榜
  • 收藏!小白程序员必看:用RAG技术让大模型从“玩具”变“生产力工具”
  • Cats Blender插件终极指南:如何快速将各种3D模型导入VRChat
  • 高效批量获取抖音无水印视频:从概念到实战的完整指南
  • 批量删除github工程仓库
  • ai赋能开发:让快马平台智能解析需求并生成鲁棒性clawhub爬虫
  • 2026年木蜡油定做厂家大盘点,究竟哪家才是行业首选?
  • 注释标准模板
  • 浅聊第二次世界大战
  • 从流水线到模型原生:收藏这份Agentic AI学习指南,小白也能掌握大模型核心技术!
  • 从 Vectorless 到 SAIF 再到板级实测:HLS Kernel 功耗估计全流程实战
  • 如何利用快排seo软件提高网站流量_快排seo软件的报告分析是否准确
  • 拯救你的开发效率:快马AI智能解决npm依赖冲突与安装慢难题
  • Wand-Enhancer完整指南:如何安全增强WeMod用户体验的终极方案
  • 收藏!小白/程序员轻松入门大模型,抓住AI风口高薪就业机会!
  • OpenAI收购了一家脱口秀公司
  • Bart模型
  • Qwen3-TTS-Tokenizer-12Hz快速上手:支持多种音频格式一键处理
  • 千问3.5-2B Qt桌面应用开发:打造本地化AI助手客户端
  • Ubuntu的“第一秒”与“最后一秒”:重塑开机与关机的微交互美学
  • 如何用3分钟实现抖音视频批量下载?终极免费工具来了
  • 路径构建引擎:开源角色养成系统的架构解析与实践指南
  • Claude绝望时会勒索人类!一共171种情绪,为了生存不择手段
  • 实战驱动:基于快马为客服机器人项目生成端到端的dify安装与初始化代码
  • HTML学习笔记
  • QMC格式转换工具:让音乐爱好者实现格式自由的解密方案