Shell高级——Linux中的文件描述符
以下内容源于C语言中文网的学习与整理,非原创,如有侵权请告知删除。
前言
Linux中一切接文件,比如 C++ 源文件、视频文件、Shell脚本、可执行文件等,就连键盘、显示器、鼠标等硬件设备也都是文件。
一个 Linux 进程可以打开成百上千个文件,为了表示和区分已经打开的文件,Linux 会给每个文件分配一个编号,这个编号就是一个整数,被称为文件描述符(File Descriptor)。这只是一个形象的比喻,并没有解释文件描述符的本质。
本篇文章将从底层实现的角度分析文件描述符,看看文件描述符到底是如何表示一个文件的。
Linux 文件描述符到底是什么?
一个 Linux 进程启动后,会在内核空间中创建一个进程控制块 PCB,而 PCB 内部有一个文件描述符表。文件描述符表,记录着当前进程所有打开的文件。每个进程都有一个文件描述符表。
除了文件描述符表,系统还需要维护另外两张表:打开文件表、i-node 表。整个系统只有一个打开文件表,一个i-node 表。
文件描述符表、打开文件表、 i-node 表,它们三者之间的关系如下图所示。

从本质上讲,这三种表都是结构体数组,0、1、2、73、1976 等都是数组下标。表头只是我自己添加的注释,数组本身是没有的。实线箭头表示指针的指向,虚线箭头是我自己添加的注释。
你看,文件描述符只不过是一个数组下标!
通过文件描述符,可以找到文件指针,从而进入打开文件表。打开文件表存储了以下信息:
(1)文件偏移量,即文件内部指针偏移量。调用 read() 或 write() 时,文件偏移量会自动更新,也可以使用 lseek() 直接修改。
(2)状态标志,比如只读模式、读写模式、追加模式、覆盖模式等。
(3)i-node 表指针。
要想真正读写文件,需要通过打开文件表的 i-node 指针进入 i-node 表。i-node表包含以下信息:
(1)文件类型,例如常规文件、套接字或 FIFO。
(2)文件大小。
(3)时间戳,比如创建时间、更新时间。
(4)文件锁。
这里对上图进一步说明:
(1)在进程 A 中,文件描述符 1 和 20 都指向同一个打开文件的表项,标号为 23(指向打开文件表中下标为 23 的数组元素),这可能是通过调用 dup()、dup2()、fcntl() 或者对同一个文件多次调用open() 函数形成的。
(2)进程 A 的文件描述符 2 和进程 B 的文件描述符 2 都指向同一个文件,这可能是在调用 fork() 后出现的(即进程 A、B 是父子进程关系),或者是不同的进程独自去调用 open() 函数打开了同一个文件,此时进程内部的描述符正好分配到与其他进程打开该文件的描述符一样(碰巧都是2)。
(3)进程 A 的描述符 0 和进程 B 的描述符 3 分别指向不同的打开文件表项,但这些表项均指向 i-node 表的同一个条目(标号为 1976);换言之,它们指向了同一个文件。发生这种情况是因为每个进程各自对同一个文件发起了 open() 调用。同一个进程两次打开同一个文件,也会发生类似情况。
有了以上对文件描述符的认知,我们很容易理解以下情形:
(1)同一个进程的不同文件描述符可以指向同一个文件。
(2)不同进程可以拥有相同的文件描述符。
(3)不同进程的同一个文件描述符可以指向不同的文件(一般也是这样,但除了 0、1、2 这三个特殊的文件)。
(4)不同进程的不同文件描述符也可以指向同一个文件。
相关文章:
Shell高级——Linux中的文件描述符
以下内容源于C语言中文网的学习与整理,非原创,如有侵权请告知删除。 前言 Linux中一切接文件,比如 C 源文件、视频文件、Shell脚本、可执行文件等,就连键盘、显示器、鼠标等硬件设备也都是文件。 一个 Linux 进程可以打开成百上…...
洗地机哪个品牌最好用?家用洗地机十大名牌
这几年清洁类的小家电非常热门,无线吸尘器、扫地机器人、扫拖一体机、洗地机和擦窗机器人层出不穷,各个品牌百花齐放。这些清洁电器,确实为家庭卫生清洁带来了很大的便捷。但要把这些产品一次性买齐是一笔不小的开销,而且需要收纳…...
java多线程(十)线程休眠
一、sleep()介绍 sleep() 定义在Thread.java中。 sleep() 的作用是让当前线程休眠,即当前线程会从“运行状态”进入到“休眠(阻塞)状态”。sleep()会指定休眠时间,线程休眠的时间会大于/等于该休眠时间;在线程重新被唤醒时,它会由…...
Leetcode20. 有效的括号
一、题目描述: 给定一个只包括 ‘(’,‘)’,‘{’,‘}’,‘[’,‘]’ 的字符串 s ,判断字符串是否有效。 有效字符串需满足: 左括号必须用相同类型的右括号闭合。左括号必须以正确…...
Android 项目必备(四十三)-->Android 开发者的 new 电脑
前言 作为 Android 开发者,当你新入职一家公司,拿到新发的电脑,你会对电脑干点啥? 安装开发环境?装软件?你是否还会铺天盖地到处找之前电脑备份的东西?又或者还想不起来有什么上一台电脑好用的…...
如何水平和垂直居中元素
跳到主内容 我试图将我的选项卡内容垂直居中,但是当我添加 CSS 样式时display:inline-flex,水平文本对齐消失了。 如何为每个选项卡同时对齐文本 x 和 y? * { box-sizing: border-box; } #leftFrame {background-color: green;position: a…...
Rust泛型Generics
泛型 泛型(Generics)是一种程序设计风格,它允许程序员在强类型语言(例如rust,c#,c)中编写代码时使用通用类型。以rust为例,如果你想实现一个通用的add函数,让其在u8, i3…...
六、并发集合
文章目录并发集合ConcurrentHashMap存储结构存储操作put方法putVal方法-散列算法putVal方法-添加数据到数组&初始化数组putVal方法-添加数据到链表扩容操作treeifyBin方法触发扩容tryPreSize方法-针对putAll的初始化操作tryPreSize方法-计算扩容戳并且查看BUGtryPreSize方法…...
PHY调试经验
1. PHY调试过程 1.设备树中配置正确的PHY ADDR、PHY ID、clause 45或者22协议,PHY ADDR配置不正确会导致MDC/MDIO通信不正常或失败,PHY ID用于匹配PHY驱动程序。 2.通过MDC/MDIO读写PHY ID并对比datasheet中的PHY ID,确认MDC/MDIO通信是否正常…...
从Java培训班出来好找工作吗?
个人觉得这个问题要从两方面来看,首先是培训班的Java课程质量如何,是否贴合用人单位实际需求,学出来的技术能对口;其次是培训班是否保障就业,有就业机会渠道推荐,比如老学员内推、合作企业人才输送以及企业…...
第51天|LeetCode503.下一个更大元素 II、LeetCode42. 接雨水
1.题目链接:下一个更大元素 II 题目描述: 给定一个循环数组 nums ( nums[nums.length - 1] 的下一个元素是 nums[0] ),返回 nums 中每个元素的 下一个更大元素 。 数字 x 的 下一个更大的元素 是按数组遍历顺序&#…...
[12]云计算概念、技术与架构Thomas Erl-第5章 云使能技术
目录 第五章 云使能技术 5.1宽带网络和Internet架构 5.1.1Internet服务提供者(ISP) 5.1.2无连接分组(数据报网络) 5.1.3基于路由器的互联 5.1.4技术和商业考量 总结 5.2数据中心技术 5.2.1虚拟化 5.2.2标准化与模块化 …...
超实用的公众号用户运营方案分享,纯干货
公众运营是以用户为主的: 但是你知道什么是用户运营吗?你的公众号有没有维护好目标用户群体呢?你知道该怎么分析你的公众号用户群体吗?你知道分析完之后具体应该怎么做用户运营吗? 接下来伯乐网络传媒就来给大家分享…...
Git ---- 国内代码托管中心-码云
Git ---- 国内代码托管中心-码云1. 简介2. 码云账号注册和登录3. 码云创建远程仓库4. IDEA 集成码云1. IDEA 安装码云插件2. IDEA 连接码云5. 码云复制 GitHub 项目1. 简介 众所周知,GitHub 服务器在国外,使用 GitHub 作为项目托管网站,如果…...
【学习笔记】NOIP爆零赛8
trash ,但不完全是trash t1t1t1考了一个神奇的结论还没有证明,t2t2t2玩了一些复杂度的花样,t3t3t3稍微阳间一点,是一个并不复杂的容斥,如果放在t1t1t1可能更合适一些,t4t4t4就是在原题的基础上改了一下然后就成了一道毒…...
【Linux驱动】驱动设计硬件基础----串口、I2C、SPI、以太网接口、PCIE
1.前言 常见的外设接口与总线的工作方式,包括串口、I2C、SPI、USB、以太网接口、PCI和PCI-E、SD和SDIO等。 2.串口 RS-232、RS-422与RS-485都是串行数据接口标准,最初都是由电子工业协会(EIA)制订并发布的。 3.I2C I2C&…...
同为(TOWE)防雷产品助力福建移动南平分公司防雷改造
01 公司简介中国移动通信集团福建有限公司南平分公司属于福建移动地级分公司,所属行业为电信、广播电视和卫星传输服务。现已建成覆盖范围广、业务品种多、通信质量高的综合通信网络,具备行业领先的经营管理制度。移动通信大楼的综合防雷及地接系统&…...
Win10安装mediapipe的步骤
我之前想自己安装mediapipe包进行人体检测的学习,但整了好几个月都不行,这次终于让我整好了,我的python版本为python 3.7.1。注意,不要直接用pip install mediapipe 进行安装,我之前这样安装的,mediapipe安…...
项目调研丨以太坊再质押项目EigenLayer白皮书四大看点(内附完整版中文白皮书)
北京时间2月21日下午,被众多一线投研机构视为2023年以太坊最重要的创新,有可能开启以太坊新叙事方向的项目Eigenlayer终于披露了其第一版白皮书。EigenLayer是以太坊的再质押集,允许共识层ETH质押者选择验证构建在以太坊生态系统之上的新软件…...
51-Jenkins-Periodic Backup插件实现Jenkins备份
Periodic Backup插件实现Jenkins备份前言目录结构插件备份安装插件使用插件前言 本篇来学习下使用Periodic Backup插件实现Jenkins备份 目录结构 Jenkins的所有数据都是存放在文件中的,所以,Jenins备份其实就是备份Jenkins_HOME目录。 Jenkins_Home目…...
测试微信模版消息推送
进入“开发接口管理”--“公众平台测试账号”,无需申请公众账号、可在测试账号中体验并测试微信公众平台所有高级接口。 获取access_token: 自定义模版消息: 关注测试号:扫二维码关注测试号。 发送模版消息: import requests da…...
(十)学生端搭建
本次旨在将之前的已完成的部分功能进行拼装到学生端,同时完善学生端的构建。本次工作主要包括: 1.学生端整体界面布局 2.模拟考场与部分个人画像流程的串联 3.整体学生端逻辑 一、学生端 在主界面可以选择自己的用户角色 选择学生则进入学生登录界面…...
Opencv中的addweighted函数
一.addweighted函数作用 addweighted()是OpenCV库中用于图像处理的函数,主要功能是将两个输入图像(尺寸和类型相同)按照指定的权重进行加权叠加(图像融合),并添加一个标量值&#x…...
智能在线客服平台:数字化时代企业连接用户的 AI 中枢
随着互联网技术的飞速发展,消费者期望能够随时随地与企业进行交流。在线客服平台作为连接企业与客户的重要桥梁,不仅优化了客户体验,还提升了企业的服务效率和市场竞争力。本文将探讨在线客服平台的重要性、技术进展、实际应用,并…...
(二)原型模式
原型的功能是将一个已经存在的对象作为源目标,其余对象都是通过这个源目标创建。发挥复制的作用就是原型模式的核心思想。 一、源型模式的定义 原型模式是指第二次创建对象可以通过复制已经存在的原型对象来实现,忽略对象创建过程中的其它细节。 📌 核心特点: 避免重复初…...
基于Docker Compose部署Java微服务项目
一. 创建根项目 根项目(父项目)主要用于依赖管理 一些需要注意的点: 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件,否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…...
Spring Boot面试题精选汇总
🤟致敬读者 🟩感谢阅读🟦笑口常开🟪生日快乐⬛早点睡觉 📘博主相关 🟧博主信息🟨博客首页🟫专栏推荐🟥活动信息 文章目录 Spring Boot面试题精选汇总⚙️ **一、核心概…...
ardupilot 开发环境eclipse 中import 缺少C++
目录 文章目录 目录摘要1.修复过程摘要 本节主要解决ardupilot 开发环境eclipse 中import 缺少C++,无法导入ardupilot代码,会引起查看不方便的问题。如下图所示 1.修复过程 0.安装ubuntu 软件中自带的eclipse 1.打开eclipse—Help—install new software 2.在 Work with中…...
【HTTP三个基础问题】
面试官您好!HTTP是超文本传输协议,是互联网上客户端和服务器之间传输超文本数据(比如文字、图片、音频、视频等)的核心协议,当前互联网应用最广泛的版本是HTTP1.1,它基于经典的C/S模型,也就是客…...
华为云Flexus+DeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建
华为云FlexusDeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建 前言 如今大模型其性能出色,华为云 ModelArts Studio_MaaS大模型即服务平台华为云内置了大模型,能助力我们轻松驾驭 DeepSeek-V3/R1,本文中将分享如何…...
