基础IO与文件系统

news2025/1/12 21:58:28

全文目录

  • C语言的文件操作函数
  • 系统调用接口
    • open
    • write
    • read
    • close
  • Linux中一切皆文件
  • 文件描述符
    • 重定向
  • 缓冲区
    • 为什么`fflush`能直接找到缓冲区进行刷新
  • 文件系统

C语言的文件操作函数

参考文章:

  1. C语言文件操作【基础知识 + 顺序读写 + 文件版通讯录】
  2. C语言文件操作收尾【随机读写 + 结束判定 + 文件缓冲区】

注意事项:

  1. 通过接口创建的文件是在当前路径下(进程的工作路径)
  2. C语言中的字符串结尾\0在文件中不起效,会出现乱码,所以向文件写入时不要将\0写入。

系统调用接口

open

在这里插入图片描述

mode:创建文件时文件的权限,同样受到umask掩码的限制。
	在进程中可以通过umask函数来设置该进程上下文的掩码

write

在这里插入图片描述

read

在这里插入图片描述

close

在这里插入图片描述

Linux中一切皆文件

OS中需要管理大量的硬件,不同硬件的读写方法都是不同的,意味着存在大量的读写函数。同时为了给用户提供良好的服务,要让用户看到所有的软硬件都是使用同样的接口 (write和read)。那么在创建文件描述符时的会根据不同的文件描述符和文件类型匹配不同的读写函数。

在这里插入图片描述

通过回调函数的方式调用具体的读写函数,在上层看来调用的都是文件的读写函数,所以一切皆文件。同样的,这也是多态的一种表现形式。

我们将存在于OS中的,文件属性数据结构的集合,称为虚拟文件系统(vfs)。通过对虚拟文件系统的管理,就可以摒弃掉底层硬件之间的差别,而统一使用文件接口的方式,来进行所有的文件(硬件)操作。

文件描述符

内核 ( k e r n e l ) (kernel) kernel利用文件描述符 ( f i l e d e s c r i p t o r ) (file descriptor) filedescriptor来访问文件。文件描述符是非负整数。打开现存文件或新建文件时,内核会返回一个文件描述符。读写文件也需要使用文件描述符来指定待读写的文件。 —— 百度百科

OS中的文件管理:

一个进程会打开大量的文件,被打开的文件需要管理,就会有文件相关的数据结构struct file来描述文件(内容 + 属性),不同的文件通过双链表链接起来。并通过指针数组file* fd_array[] 存放每个结构体的指针。 进程的PCB结构体中同样通过结构体struct files_struct来描述这个数组指针。文件描述符的本质就是存放struct file的指针数组的下标。

在这里插入图片描述

C语言的库函数原理:

在C语言程序中默认会打开三个标准输入输出流: s t d i n 、 s t d o u t 、 s t d e r r stdin、stdout、stderr stdinstdoutstderr,在OS中默认占用0、1、2三个文件描述符。C语言中的FILE结构体中包含系统的文件描述符,并在底层通过系统调用接口进行文件读写。

分配规则:

分配最小的、没有被占用的文件描述符

重定向

在Linux中一切皆文件,标准输入输出流也是文件。利用文件描述符的分配规则就能将标准输入输出流的文件描述符指向指定的文件,实现重定向。

本质:更改文件描述符的指向

系统调用接口

dup2

标准错误重定向:

./myfile > 1.txt 2>2.txt   
# 将1.txt的文件描述符指向的内容拷贝到1号文件描述符中
# 将2.txt的文件描述符指向的内容拷贝到2号文件描述符中


./myfile > 1.txt 2>&1  	
# 将1.txt的文件描述符指向的内容拷贝到1号文件描述符中
# 同时将1号文件描述符指向的内容拷贝到2号文件描述符中

缓冲区

为了提高整机效率,减少IO次数,C语言给每个文件提供了缓冲区,所有的硬件都是倾向于全缓冲的。但为了提高用户的体验,对于不同的设备,会采取不同的刷新策略。

刷新策略:

  • 显示器【行缓冲】
  • 磁盘【全缓冲】

缓冲区内的数据也是进程的数据,所以当fork创建子进程时也会发生写时拷贝。对于不同的设备,同样的代码可能发生不一样的结果。

为什么fflush能直接找到缓冲区进行刷新

在C语言层面,描述文件的是FILE类型的结构体,里面不仅仅封装了文件描述符,还包含了缓冲区信息。也就

syncfs(fd);  	# 将缓冲区的数据刷新到磁盘

文件系统

Linux管理磁盘上的文件时,是将内容和属性分开存储的

文件系统结构

总结:

  1. 其中的super block 和 GDT存放整个文件系统的对应信息。

  2. 目录也是文件,目录的datas block 中存放着文件名和inode编号的映射关系(目录权限对应目录的操作)

  3. 软链接就是创建快捷方式,有独立的inode编号

  4. 硬链接就是起别名,通过引用计数的方式共用同一数据

  5. 目录的起始链接数就是2, 当目录中多了一个目录计数++

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/781869.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

FPGA工程中eclipse软件常见的错误

错误一: Unresolved inclusion: "altera_avalon_uart_regs.h" Unresolved inclusion: "system.h"Description Resource Path Location Type Type alt_u8 could not be resolved hello_world.c /UART line 37 Semantic Error描述:这个…

【计算机网络 02】物理层基本概念 传输媒体 传输方式 编码与调制 信道极限容量 章节小结

第二章 -- 物理层 2.1 物理层基本概念2.2 物理层下的传输媒体2.3 传输方式2.4 编码与调制2.5 信道极限容量2.6 章节小结 2.1 物理层基本概念 2.2 物理层下的传输媒体 传输媒体也称为传输介质或传输媒介,他就是数据传输系统中在发送器和接收器之间的物理通路 传输媒…

统信UOS安装nginx及其所需部件

/usr/local 为Linux默认软件安装路径,类似于C:\Program Files。 因此在local路径下新建nginx文件夹安装nginx。 下载并安装nginx (1)进入nginx文件夹下,使用 wget 命令下载nginx资源包 命令:wget http://nginx.org/…

微服务——http客户端Feign

目录 Restemplate方式调用存在的问题 Feign的介绍 基于Feign远程调用 Feign自定义配置 修改日志方式一(基于配置文件) 修改日志方式二(基于java代码) Feign的性能优化 连接池使用方法 Feign_最佳实践分析 方式一: 方式二 实现Feign最佳实践(方式二) 两种解决方案 Re…

Kubernetes教程(三)---纯三层网络方案

来自:指月 https://www.lixueduan.com 原文:https://www.lixueduan.com/posts/kubernetes/02-cluster-network/ 由于 COPY 过来图片无法展示,建议跳转到原文查看 本文主要介绍了 Kubernetes 中的 Pure Layer 3 网络方案。其中的典型例子&…

msvcp120.dll丢失的解决方法,msvcp120.dll一键修复方法

最近我遇到了一个让我头疼的问题,那就是在使用某个软件时出现了msvcp120.dll文件缺失的错误。这个错误导致我无法正常运行该软件,给我的工作和生活带来了很大的困扰。 起初,我尝试了一些简单的解决方法,比如重新安装软件、重启电脑…

Appium+python自动化(十八)- - Monkey事件

操作事件简介 Monkey所执行的随机事件流中包含11大事件,分别是触摸事件、手势事件、二指缩放事件、轨迹事件、屏幕旋转事件、基本导航事件、主要导航事件、系统按键事件、启动Activity事件、键盘事件、其他类型事件。Monkey通过这11大事件来模拟用户的常规操作&…

机器学习 深度学习编程笔记

sigmoid函数 def sigmoid(x):return 1.0 / (1np.exp((-x)))定义最小平方和损失函数 loss torch.nn.MSELoss()线性回归编程 如果不加噪音就成了正常的线性函数了,所以要加噪音。 torch.normal(0, 0.01, y.shape)torch.normal(0, 0.01, y.shape)是一个用于生成服从…

Vue 复杂json数据在el-table表格中展示(el-table分割数据)

文章目录 前言问题背景实现复杂json数据在el-table表格展示el-table-column分割线el-table-column高度 前言 在做复杂的动态表单,实现业务动态变动,比如有一条需要动态添加的el-form-item中包含了多个输入框,并实现表单验证,但在…

智慧税务大厅业务办理vr模拟体验提升缴税效率和质量

目前的税务部门的办事大厅,承载着纳税人的各种税务事项的办理,业务量较大,特别是窗口工作人员,在税务办理的高峰期,经常会遇到人手不够的情况,如果能够将vr技术应用的税务办理的环节中,让使用者…

FPGA FIFO——IP核

文章目录 前言一、FIFO1、区别2、分类 二、单时钟&多时钟FIFO框图三、FIFO IP 核配置四、源码1、fifo_wr(写模块)2、fifo_rd(读模块)3、ip_fifo(顶层文件) 五、仿真1、仿真文件2、波形分析 六、SignalTap II在线验证七、总结八、参考资料 前言 环境: 1、Quartus…

python与深度学习(六):CNN和手写数字识别二

目录 1. 说明2. 手写数字识别的CNN模型测试2.1 导入相关库2.2 加载数据和模型2.3 设置保存图片的路径2.4 加载图片2.5 图片预处理2.6 对图片进行预测2.7 显示图片 3. 完整代码和显示结果4. 多张图片进行测试的完整代码以及结果 1. 说明 本篇文章是对上篇文章训练的模型进行测试…

5.5.tensorRT基础(2)-封装插件过程,并实现更容易的插件开发

目录 前言1. 插件封装2. 补充知识总结 前言 杜老师推出的 tensorRT从零起步高性能部署 课程,之前有看过一遍,但是没有做笔记,很多东西也忘了。这次重新撸一遍,顺便记记笔记。 本次课程学习 tensorRT 基础-封装插件过程&#xff0c…

5G的发展过程

目录 1.什么是5G 2.5G与4G的区别 3.5G的应用领域 4.5G给人类带来的福利 5.5G未来的发展趋势 1.什么是5G 5G技术是第五代移动通信技术,它是对之前的2G、3G和4G技术的升级和革新。5G技术具有更高的数据传输速度、更低的延迟和更大的网络容量,为人们提供…

Qt简单实现密码器控件

本文实例为大家分享了Qt自定义一个密码器控件的简单实现代码,供大家参考,具体内容如下 实现构思: 密码器的功能可以看成是计算器和登陆界面的组合,所以在实现功能的过程中借鉴了大神的计算器的实现代码和登陆界面实现的代码。 …

20230720在ubuntu22.04系统下载+解密+合并ts切片的步骤(STEP-BY-STEP版本)

20230720在ubuntu22.04系统下载解密合并ts切片的步骤(STEP-BY-STEP版本) 2023/7/20 23:06 https://app1ce7glfm1187.h5.xiaoeknow.com/v2/course/alive/l_64af6130e4b03e4b54da1681?type2&app_idapp1cE7gLFM1187&pro_idterm_645c69388953e_Nhew…

人类机器人编程的心理机制(一)

\qquad 本文中的人类机器人编程(Human Robot Programming)意指“基于创伤的脑控(trauma-based mind control, T.B.M.C)”或“基于创伤的编程(trauma-based programming)”,文中用英文缩写“T.B.M.C”指代。T.B.M.C的操纵主体是施加编程的个人或机构,文中…

个人博客系统(三)

在个人博客系统(二)中介绍了注册页面和登录页面,这两个页面比较简单,最重要的一个问题是验证码的实现,具体详情可见:http://t.csdn.cn/EyVjz​​​​​​ 接下来,本博客主要介绍的是添加博客页面和修改博客页面。 1 添加博客页面 该页面如图所示: 首先判断文章标题是…

AcWing算法提高课笔记

目录 Level2 1.动态规划——从集合角度考虑DP问题 1.1 数字三角形模型 1.1.1摘花生 1.1.2最低通行费 1.1.3方格取数 1.1.4传纸条 1.2 最长上升子序列模型 1.2.1怪盗基德的滑翔翼 1.2.2登山 1.2.3合唱队形 1.2.4好友城市 1.2.5最大上升子序列和 1.2.6拦截导弹 1.2…

MySQL下载与安装

MySQL下载与安装 一、下载 地址:https://dev.mysql.com/downloads/mysql/ 当前最新是8.0版本,我选择上一个最新的mysql-5.7.24-winx64.zip 二、安装 MySQL安装文件分两种 .msi和.zip ,.msi需要安装 zip格式是自己解压,解压缩之后…