Linux:文件流指针 与 文件描述符
目录
- 一、文件描述符
- 二、文件流指针
- 三、缓冲区
之前讲解过了IO库函数和IO接口,库函数是对系统调用接口的封装,也就是说实际上在库函数内部是通过调用系统调用接口来完成最终功能的。
库函数通过文件流指针操作文件,系统调用接口通过文件描述符操作文件。实际上文件流指针就是系统将文件描述符封装后得来的,本文来简单聊一聊它们。
一、文件描述符
文件描述符:
使用系统调用接口open打开一个文件,如果打开成功会返回一个非负整数,这个数字就是这个文件的文件描述符,就是一个文件的操作句柄。
操作句柄:
用杯子来举例,我们要喝水时,端着杯子的把手,借助这个把手来操作杯子,这个把手就是杯子的操作句柄。在文件操作中,我们通过文件描述符来操作对应的文件,这个文件描述符就是文件的操作句柄。
为什么可以通过文件描述符操作文件?
文件是什么?文件就是一块磁盘空间。给文件写入数据,其实就是写入到了磁盘的指定位置。但磁盘中不止存储了这个文件,还有一块空间用来存储这个文件的描述信息,这个描述信息就是文件的属性。这就类似于进程pcb,pcb就是对动态运行的程序的描述。
如图:硬盘中存储了文件和文件的描述信息。

在程序的运行中,我们可能会有多个文件被使用,所以我们要把这些文件管理起来,让我们可以高效的访问。
因此在Linux的进程pcb中还有一个用来存储文件相关内容的结构体 files_struct,这个结构体中有一个指针数组 fd_arr[],这个数组中存储的就是每个文件的描述信息 struct_file 的地址,而这个地址的下标就是文件描述符。
通过文件描述符控制文件其实就是找到files_struct后,找到fd_arr数组,然后根据的文件描述符(也就是数组下标),找到数组中的对应的地址,然后就可以找到文件的描述信息。

二、文件流指针
系统调用接口通过文件描述符来操作文件,而库函数则是通过文件流指针来操作对应文件。
库函数和系统调用接口的关系
库函数其实是对系统调用接口的封装,系统调用接口加上一点其他内容就构成了库函数。因此文件流指针其实就是对文件描述符的封装,它的内部也是使用文件描述符来操作文件的。
文件流指针就是一个 struct FILE* 类型的变量,而struct FILE是stdio.h头文件中的结构体,我们来看一下头文件中对于FILE的描述。
如图:头文件中可以看到,FILE其实是_IO_FILE的别名,所以FILE其实就是_IO_FILE,FILE* 指针就是 _IO_FILE* 指针。

接下来看一下 _IO_FILE 结构体的部分内容:269行的 int _fileno 就是文件描述符,结构体把文件描述符封装了起来。

三、缓冲区
IO库函数有缓冲区,而系统调用IO接口没有缓冲区,因为缓冲区封装在库函数中的 _IO_FILE 结构体中。

这幅图的252到263行其实就是缓冲区,用读缓冲区举个例子。缓冲区是在用户空间中申请的一块空间,252行的指针指向这块空间的当前读写位置,253行的指针指向这块缓冲区空间的结束地址,254行的指针指向这块空间的开始地址。
当读取数据时,就会从当前读写位置开始,一直读取到空间结束。写入文件时,从当前读写位置开始写,当写入到结束位置,代表着缓冲区写满了,需要刷新了。这样就用指针实现了缓冲区。
相关文章:
Linux:文件流指针 与 文件描述符
目录一、文件描述符二、文件流指针三、缓冲区之前讲解过了IO库函数和IO接口,库函数是对系统调用接口的封装,也就是说实际上在库函数内部是通过调用系统调用接口来完成最终功能的。 库函数通过文件流指针操作文件,系统调用接口通过文件描述符操…...
基于FPGA实现正弦插值算法
1、正弦插值的算法分析 1.1 信号在时域与频域的映射关系 在进行正弦算法分析之前,我们回顾一下《数字信号处理》课程中,对于信号在时域与频域之间的映射关系,如下图。 对于上图中的原始信号x(t),使用ADC对信号进行采样࿰…...
JavaWeb_会话技术
文章目录会话跟踪技术的概述Cookie概念Cookie工作流程Cookie基本使用发送Cookie获取CookieCookie原理分析Cookie的使用细节Cookie的存活时间Cookie存储中文SessionSession的基本使用概念工作流程Session的基本使用Session的原理分析Session的使用细节Session的钝化与活化Sessio…...
Reactor响应式流的核心机制——背压机制
响应式流是什么? 响应式流旨在为无阻塞异步流处理提供一个标准。它旨在解决处理元素流的问题——如何将元素流从发布者传递到订阅者,而不需要发布者阻塞,或订阅者有无限制的缓冲区或丢弃。 响应式流模型存在两种基本的实现机制。一种就是传统…...
[数据结构]栈的深入学习-java实现
CSDN的各位uu们你们好,今天千泽带来了栈的深入学习,我们会简单的用代码实现一下栈, 接下来让我们一起进入栈的神奇小世界吧!0.速览文章一、栈的定义1. 栈的概念2. 栈的图解二、栈的模拟实现三.栈的经典使用场景-逆波兰表达式总结一、栈的定义 1. 栈的概念 栈:一种…...
网络编程基础
1 互联网的本质硬件设备有了操作系统,然后装上软件之后我们就能够正常使用了,然后也只能自己使用。像这样,每个人都拥有一台自己的机器,然而彼此孤立。如何才能和大家一起愉快的玩耍?什么是网络?简单来说&a…...
华为OD机试题 - 数列还原(JavaScript)| 机考必刷
更多题库,搜索引擎搜 梦想橡皮擦华为OD 👑👑👑 更多华为OD题库,搜 梦想橡皮擦 华为OD 👑👑👑 更多华为机考题库,搜 梦想橡皮擦华为OD 👑👑👑 华为OD机试题 最近更新的博客使用说明本篇题解:数列还原题目输入输出示例一输入输出Code代码解析版权说明华为O…...
10-Oracle存储过程(创建,修改,使用及管理)
本章内容 1、我们为什么要用存储过程? 2、存储过程是如何定义和维护的? 3、我们如何调用存储过程? 4、存储过程中常用的复合数据处理方式及CTE 5、存储过程如何进行异常处理? 6、存储过程如何进行事务处理? 7、我们应如何优化存储过程? 1、我们为什么要用存储过程…...
创建线程的三种方法
文章目录1、创建一个类实现Runnable接口,并重写run方法。2、创建一个类继承Thread类,并重写run方法。3、实现Callable接口,重写call()方法,这种方式可以通过FutureTask获取任务执行的返回值。4、run()方法和start()方法有什么区别…...
第一章---Pytorch快速入门---第三节---pytorch中的数据操作和预处理
目录 1.高维数组 1.1 回归数据准备 1.2 分类数据准备 2. 图像数据 1.torchvision.datasets模块导入数据并预处理 2.从文件夹中导入数据并进行预处理 pytorch中torch.utils.data模块包含着一些常用的数据预处理的操作,主要用于数据的读取、切分、准备等。 常用…...
【代码随想录训练营】【Day38】第九章|动态规划|理论基础|509. 斐波那契数|70. 爬楼梯|746. 使用最小花费爬楼梯
理论基础 动态规划与贪心的区别并不是学习动态规划所必须了解的,所以并不重要。 想要了解动态规划算法题的特点,可以直接做下面三道入门简单题练练手感,找找感觉,很快就能体会到动态规划的解题思想。 总结成一句话就是…...
华为OD机试题 - 快递货车(JavaScript)| 机考必刷
更多题库,搜索引擎搜 梦想橡皮擦华为OD 👑👑👑 更多华为OD题库,搜 梦想橡皮擦 华为OD 👑👑👑 更多华为机考题库,搜 梦想橡皮擦华为OD 👑👑👑 华为OD机试题 最近更新的博客使用说明本篇题解:快递货车题目输入输出示例一输入输出Code解题思路版权说明华为O…...
前端——7.图像标签和路径
这篇文章,我们来讲解一下图像标签 目录 1.图像标签 1.1介绍 1.2实际展示 1.3图像标签的属性 1.3.1 alt属性 1.3.2 title属性 1.3.3 width / height 属性 1.3.4 border属性 1.4注意事项 2.文件夹 2.1目录文件夹和根目录 2.2 VSCode打开目录文件夹 3.路…...
java -- stream流
写在前面: stream流一直在使用,但是感觉还不够精通,现在深入研究一下。 stream这个章节中,会用到 函数式接口–lambda表达式–方法引用的相关知识 介绍 是jdk8引进的新特性。 stream流是类似一条流水线一样的操作,每次对数据进…...
【Spring6】| Bean的四种获取方式(实例化)
目录 一:Bean的实例化方式 1. 通过构造方法实例化 2. 通过简单工厂模式实例化 3. 通过factory-bean实例化 4. 通过FactoryBean接口实例化 5. BeanFactory和FactoryBean的区别(面试题) 6. 使用FactoryBean注入自定义Date 一:…...
01: 新手学SpringCloud前需知道的5点
目录 第一点: 什么是微服务架构 第二点:为什么需要学习Spring Cloud 第三点: Spring Cloud 是什么 第四点: SpringCloud的优缺点 1、SpringCloud优点 2、SpringCloud缺点 第五点: SpringCloud由什么组成 1&…...
ubuntu apt安装arm交叉编译工具
查找查找编译目标为32位的gcc-arm交叉编译器命令apt-cache search arm|awk index($1,"arm")!0 {print}|grep gcc-arm\|g-arm #或者 apt-cache search arm|awk index($1,"arm")!0 {print}|grep -E gcc-arm|g\\-arm输出如下g-arm-linux-gnueabihf - GNU C co…...
阿里云一面经历
文章目录 ES 查询方式都有哪些?1 基于词项的查询term & terms 查询Fuzzy QueryWildcard Query2 基于全文的查询Match QueryQuery String QueryMatch Phrase Query3 复合查询Bool QueryElasticsearch 删除原理ES 大文章怎么存arthas 常用命令arthas 排查问题过程arthas 工作…...
Java Stream中 用List集合统计 求和 最大值 最小值 平均值
对集合数据的统计,是开发中常用的功能,掌握好Java Stream提供的方法,避免自己写代码统计,可以提高工作效率。 先造点数据: pigs.add(new Pig(1, "猪爸爸", 31, "M", false)); pigs.add(new Pig(…...
【Linux】多线程---线程控制
进程在前面已经讲过了,所以这次我们来讨论一下多线程。前言:线程的背景进程是Linux中资源及事物管理的基本单位,是系统进行资源分配和调度的一个独立单位。但是实现进程间通信需要借助操作系统中专门的通信机制,但是只这些机制将占…...
别再只用yum了!手把手教你用RPM包在CentOS 7.9上安装最新版LibreOffice 7.5.4(含中文包)
告别老旧版本:CentOS 7.9手动安装LibreOffice 7.5.4全攻略 在开源办公软件领域,LibreOffice无疑是当前最活跃、功能最全面的选择之一。然而许多CentOS用户发现,通过系统默认的yum仓库安装的LibreOffice版本往往落后官方最新版数年之久。以Cen…...
APK Installer:在Windows上轻松安装Android应用的完整指南
APK Installer:在Windows上轻松安装Android应用的完整指南 【免费下载链接】APK-Installer An Android Application Installer for Windows 项目地址: https://gitcode.com/GitHub_Trending/ap/APK-Installer APK Installer是一款专为Windows系统设计的Andro…...
蘑菇博客MoguBlog:微服务架构的前后端分离博客系统完整指南 [特殊字符]
蘑菇博客MoguBlog:微服务架构的前后端分离博客系统完整指南 🚀 【免费下载链接】mogu_blog_v2 蘑菇博客(MoguBlog),一个基于微服务架构的前后端分离博客系统。Web端使用Vue Element , 移动端使用uniapp和ColorUI。后端使用Spring cloud Spr…...
不止是部署:深入webrtc-streamer容器,聊聊WebRTC网关的配置、监控与生产环境实践
不止是部署:深入webrtc-streamer容器,聊聊WebRTC网关的配置、监控与生产环境实践 当你已经成功运行了基础版的webrtc-streamer容器,看着浏览器里跳动的视频流,那种成就感不言而喻。但很快你会发现,这仅仅是WebRTC世界的…...
uniCloud云函数实战:从‘Hello World’到连接数据库的完整数据流指南
uniCloud云函数实战:从‘Hello World’到连接数据库的完整数据流指南 在当今快速迭代的互联网开发领域,后端服务的轻量化与敏捷部署已成为开发者关注的焦点。uniCloud作为一款面向全栈开发的云服务平台,其云函数功能让前端开发者也能轻松处理…...
QEMU理解与分析系列(16):QEMU启动方式分析
QEMU启动方式分析启动流程RISC-V specific│┌──────────────────┼──────────────────┐▼ ▼ ▼┌──────────────┐ ┌──────────────┐ ┌───────────…...
别再死记硬背ELMo、GPT、BERT的区别了!一张图带你搞懂它们的核心差异与适用场景
一图胜千言:ELMo、GPT、BERT技术差异与实战选型指南 刚接触NLP时,我也曾被各种预训练模型绕得头晕眼花——它们看起来都能处理文本,但面试官一问"为什么用BERT不用GPT"就瞬间语塞。直到我把这些模型拆解成汽车零件,才真…...
告别串口助手!用手机APP和ESP-01S模块,5分钟搞定51单片机无线控制LED
手机APP直连ESP-01S:零门槛实现51单片机LED无线控制 在物联网原型开发中,摆脱串口助手的束缚,直接用手机APP控制硬件设备,是许多初学者的迫切需求。本文将带你用最常见的ESP-01S模块和任意一款TCP调试APP,在5分钟内搭建…...
8351健康管理中心用黑科技设备为企业家筑起生命防线
事业的成功固然值得骄傲,但如果没有健康作为根基,一切的辉煌都显得摇摇欲坠。对于每天在高压下决策、在商海中搏击的企业家而言,健康早已不是一句简单的口号,而是一场需要长期投入的战略投资。然而现实往往是,很多企业…...
外部系统调用SAP数据?用ABAP RFC函数搭个“桥梁”其实很简单(含Function Group创建避坑)
跨系统数据整合:ABAP RFC函数的设计哲学与实战指南 当企业数字化转型进入深水区,业务系统间的数据孤岛问题日益凸显。某零售企业的供应链总监最近就面临这样的挑战:"我们的电商平台需要实时获取SAP中的库存数据,但每次手工导…...
