首页 > 其他分享 >标准IO接口说明

标准IO接口说明

时间:2024-07-08 23:02:00浏览次数:17  
标签:文件 -- 接口 标准 内核 IO

标准IO接口说明

数据都是以文件的形式存储在Linux系统中,并且Linux系统为了简化不同类型文件的操作流程,在设计访问接口时也遵循POSIX标准,而POSIX标准就是对不同操作系统的访问接口做出统一的规范,目的是提高程序的兼容性和可移植性。经常使用的C语言同样具有语法标准,并且C语言标准在发布的时候也会发布对应的库函数提供给用户。这些库函数也同样遵循POSIX标准进行设计,而遵循POSIX标准设计出来的函数的集合也被称为标准库,比如大家使用的标准C库中提供了标准的输入输出函数,这些函数在Linux系统可以使用,同样也可以在Windows系统中使用。用户可以根据标准输入输出头文件<stdio.h>中的函数声明进行调用,Linux系统下该头文件路径为 /user/include。
image


另外,由于任何一种操作系统都会有访问磁盘文件的需求,所以POSIX标准中同样对访问文件的输入输出接口做出了约束,这些访问文件的函数接口在C语言标准中都有具体的描述。
标准C库中关于文件输入输出的函数接口一般被称为标准IO,访问文件常用的标准IO函数有fopen()、fread()、fwrite()、fclose()、fgetc()、fputc()、fgets()、fputs()、fprintf()、fscanf()等。
image


FILE类型其实是一个结构体数据类型,它包含了标准 I/O 库函数为管理文件所需要的所有信息,比如包括用于实际I/O 的文件描述符、指向文件缓冲区的指针、缓冲区的长度、当前缓冲区中的字节数以及出错标志等。头文件stdio.h中有关于FILE类型的相关描述,如:
image
image


阅读stdio.h中的条件编译选项可以发现在stdio.h中还包含了另一个头文件<libio.h>,这个头文件中才有关于FILE结构体类型的定义,该头文件的路径同样在Linux系统的/user/include目录下。
image


打开头文件<libio.h>之后,可以找到关于FILE结构体类型的定义,可以发现FILE结构体类型中的成员数量很多
image


可以看到FILE结构体类型中有一个成员是FILE类型的指针变量chain,该指针可以指向下一个被打开文件的文件信息区,也就是可以把FILE类型当做数据结构中的链表的结点,结点中除了可以存储数据域之外,还可以利用指针域存储下一个结点的地址。
简单理解:用户可以在一个程序中利用fopen函数打开多个文件,每次打开一个文件,内核就会从堆内存中申请一块FILE结构体大小的空间用来存储文件的所有信息,然后按照文件打开的顺序把每个打开的文件的结构体形成一条链表,然后使用链表头进行管理。
注意:打开文件的目的无非就是对文件进行读写操作,所以每次当程序运行的时候已经有三个文件流被打开,分别是标准输入stdin、标准输出stdout、标准出错stderr,这三者在stdio.h中也是FILE指针。
image


所以内核在管理被打开文件的时候,链表中已经有三个结点存在,然后再把新节点头插入到链表中。
image
image


注意:使用标准IO的时候,是不可以反复关闭相同的文件,因为释放已经被释放的堆内存,会导致段错误!!


系统IO接口说明

基本概念

由于Linux系统下“一切皆文件”,也就是Linux系统下的数据和程序(shell命令)都是以文件的形式存储的,所以Linux内核会提供一组操作文件的函数接口,这组函数接口也被称为系统IO,同时为了满足用户访问文件的需求以及提高用户程序的可移植性,标准库也提供了一组操作文件的函数接口,这组函数接口也被称为标准IO,只不过标准库提供的标准IO函数都是遵循ANSI C标准设计出来,是为了方便用户在不同的操作系统下可以调用通用的函数来实现对文件的读写访问,但其实标准IO也是基于内核提供的系统IO设计出来的。


两者区别

标准IO的优点是提供了缓冲区并且函数接口非常丰富,虽然标准IO是在系统IO的基础之上实现的,但是由于标准IO提供了输入输出缓冲区,这样可以避免频繁的系统调用,而且不用人为关心缓冲区大小的选择,整体上提高了I/O的效率。但是缺点是没有办法针对某些类型的文件(链接文件、套接字文件)进行访问,所以一般适合访问普通文件。

而系统IO的缺点是不具备输入输出缓冲区,也就是没办法高效处理数据,原因是系统调用与普通函数调用相比通常需要花费更多的时间,因为系统调用的过程中内核要执行一系列的操作:首先内核需要捕获调用,然后再检查系统调用传递的参数的有效性,最后在用户空间和内核空间之间传输数据。但是系统IO的优点是可以针对特定类型文件进行访问,所以一般适合访问数据需要实时刷新的硬件设备(LCD、触摸屏......)。

简单理解:标准I/O可以看成是在系统I/O的基础上封装了缓冲机制。这样可以先读写缓冲区,必要时再访问实际文件,从而减少了系统调用的次数,提高访问效率。

fwrite() --> a.txt -->fwrite(buf,1,1,fp); --> write() --> 100个字节要写--> 调用100次write() -->慢
fwrite() --> a.txt -->fwrite(buf,1,100,fp); -->write() -->100个字节要写-->调用001次write() -->快


open函数的返回值可以理解为是被打开文件的代号,内核并不是以被打开文件的路径和名称来管理文件,而是在调用open函数的时候会从未分配的文件描述符中找到一个最小的提供给被打开的文件。在对文件进行读写(R/W)访问时同样是通过这个文件描述符实现。
文件描述符本质就是一个非负整数,从内核源码角度分析,这个整数实际上是内核中的一个称为 fd_array 的数组下标。
打开文件时,内核产生一个指向 file{} 的指针,并将该指针放入一个位于 file_struct{} 中的数组 fd_array[] 中,而该指针所在数组的下标,就被 open() 返回给用户,所以内核把这个数组下标称为文件描述符。
文件描述符从0开始分配,每打开一个文件,就产生一个新的文件描述符。当然,用户可以重复打开同一个文件,每次打开文件都会使内核产生新的结构体,并得到不同的文件描述符。
image

标签:文件,--,接口,标准,内核,IO
From: https://www.cnblogs.com/hhail08/p/18290812

相关文章

  • 虚拟机的建立(VMware Workstation Pro)
    创建虚拟机下载vm和Ubuntu镜像vm:VMwareDesktopHypervisorsforWindows,Linux,andMac密钥:网上搜一大堆iso:Alternativedownloads|Ubuntu选择镜像并创建实例完成......
  • 2024已过半,还没试过在vue3中使用ioc容器吗?
    Vue3已经非常强大和灵活了,为什么还要引入IOC容器呢?IOC容器离不开Class,那么我们就从Class谈起Class的应用场景一提起Class,大家一定会想到这是Vue官方不再推荐的代码范式。其实,更确切的说,Vue官方是不推荐基于Class来定义Vue组件。如图所示:社区确实有几款基于Clas......
  • 高创新 | CEEMDAN-VMD-GRU-Attention双重分解+门控循环单元+注意力机制多元时间序列预
    目录效果一览基本介绍模型设计程序设计参考资料效果一览基本介绍高创新|CEEMDAN-VMD-GRU-Attention双重分解+门控循环单元+注意力机制多元时间序列预测本文提出一种基于CEEMDAN的二次分解方法,通过样本熵重构CEEMDAN分解后的序列,复杂序列通过VMD分解......
  • 【无标题】哈氏合金板执行标准详情介绍
    哈氏合金板执行标准详情介绍一、引言;江苏首富钢业制品有限公司哈氏合金板是一种高性能耐腐蚀合金材料,广泛应用于化工、石油、制药等领域。为了确保哈氏合金板的质量和性能,制定并执行一系列的执行标准显得尤为重要。本文将详细介绍哈氏合金板的执行标准,包括材料化学成分、力学......
  • 单片机知多少之STM32F103-GPIO输出应用篇
    示例:选择GPIOB做流水灯控制逻辑将8个发光二极管的负端分别接入PB0~PB7,正端接5V电源,当配置GPIO为低电平时,回路导通,二极管开始工作,亮灯;当配置GPIO为高电平时,回路等电位断开,二极管不工作,灭灯,使GPIO输出按一定顺序执行,即流水灯。编写代码变量定义:GPIO_InitTypeDefGPIO_InitSt......
  • Solution - Atcoder ARC150D Removing Gacha
    考虑到每次操作都比定会选上一个点,于是答案可以表示为每个点被选中的次数之和。即令\(c_i\)为\(i\)点被选中的次数,答案即为\(E(\sum\limits_{i=1}^nc_i)\)。根据期望的线性性,考虑把答案的\(E\)拆到每个\(c_i\)上,即变为\(\sum\limits_{i=1}^nE(c_i)\)的形式。......
  • CSE 105 Summer Session
    CSE 105Summer Session 1 2024Homework 1Due date: Sunday July 7 at 11:59pmInstructionsOne member of the group should upload your group submission to Gradescope. During thesubmissionprocess,theywillbepromptedtoaddthenameso......
  • 保姆级阿里云接入http接口加密数据教程,一看就会!大厂经验分享,接口数据落表
    前言:有关接口数据的接入,源端会给予我们一份接口说明文件,接着我们需依据对方提供的接口文档进行代码编写,以实现数据落表。接入步骤大致可分为以下几步:1.依据对方提供的接口文档,明确接口地址、请求方式、传参信息以及参数格式等。2.借助编写代码,获取接口数据内容。3.按照......
  • 如何用Stable Diffusion给人物换脸(免费插件学完就能用)
    哈喽大家好,AI今天给大家分享是的如果利用StableDiffusion给人物换脸!今天给大家推荐一款插件,不用训练loar也能给人物进行换脸!我们都知道日常换脸,需要的技术难度大,而且普通技术换脸的效果往往不够自然,尤其是在表情和面部细节的处理上。容易产生不真实感和违和感,光影融合度较......
  • Stable Diffusion 图生图之局部重绘
    StableDiffusion图生图(局部重绘):局部重绘:·在图生图界面中关于局部重绘有三个标签页.·这三个标签页主要是蒙版的使用方式不同.局部重绘标签.图片可以通过上传,或者是从文生图发送到局部重绘.右边是局部重绘的画笔工具.·局部重绘中,画布和画笔大小有快......