【linux基础I/O(二)】文件系统讲解以及文件缓冲区的概念

news2024/11/16 21:38:40

💓博主CSDN主页:杭电码农-NEO💓

⏩专栏分类:Linux从入门到精通⏪

🚚代码仓库:NEO的学习日记🚚

🌹关注我🫵带你学更多操作系统知识
  🔝🔝


在这里插入图片描述

基础I/O

  • 1. 前言
  • 2. 理解C语言的缓冲区
  • 3. 对文件系统的初认识
  • 4. 扇区中的块组是如何工作的?
  • 5. 理解软硬链接
  • 6. 理解动静态库
  • 7. 总结

1. 前言

对于文件来讲,有打开的在内存中
的文件,也有没有打开的在磁盘上
文件,上一篇文章讲解的是前者,本篇
文章将带大家了解后者!

本章重点:

本篇文章着重讲解在磁盘中的文件的
存储方式以及inode相关概念.在这之前
会解释C语言缓冲区的概念以及作用,
最后会带大家了解软硬链接如何创建,
软硬链接的区别,理解动静态库


2. 理解C语言的缓冲区

缓冲区的本质就是一段内存空间
那么为什么要有缓冲区?讲个例子

你在云南大学想要将一本书送给你在
北京邮电大学的好友,你会亲自将书带
过去给他然后再回云南吗?显然不可能
你会去楼下的顺丰快递将书籍让顺丰帮
你寄到北京区,你就代表一个用户,而书籍
就是你要发送给其他用户的数据,顺丰就
是这个缓冲区.很明显缓冲区有以下性质:

  • 顺丰拿到你的快递立刻发送(立刻刷新)
  • 等累计快递达到一定数量统一发送(行刷新)
  • 或者当快递站放满了再发送快递(满刷新)

在这里插入图片描述
行缓存的设备文件: 显示器(关心用户体验)
全缓存的设备文件: 磁盘文件(关心效率)

执行下面的代码时,不会立刻打印出信息:

printf("abcdef");
sleep(5);
return 0;

因为printf后没有\n刷新缓冲区,所以
信息不会立刻打印出来,当休眠五秒
后程序退出时才会进行刷新缓冲区!

函数fflush可以强制刷新缓冲区

在这里插入图片描述

除此之外,既然操作系统只认识文件描述符
fd,所以C语言的FILE结构体中一定封装了fd
,并且C语言的缓冲区实际上也是在FILE结构
体中维护的!也就是说直接使用系统调用去进
行输出工作是不会有缓冲区的概念的!


3. 对文件系统的初认识

对于已经在内存中打开的文件来说,它的
结构无非就是OS为它创建的struct file,
但是对于未打开的文件也就是存储在磁盘
上的文件,是怎样管理的呢?

看看关于磁盘结构的剖析图:
在这里插入图片描述
磁盘看似是一张盘面,实际上内部分为
很多个面,一个面对于一个磁头,这是正
视图的磁盘,再来看看俯视图的磁盘:

在这里插入图片描述

对于磁盘的每一个面来说,并不是所有
的区域都可以用来存储数据,可以把特
定的磁道中特定的扇区看作是一个小
数组,此小数组中存储文件的属性内容
一般而言一个扇区的大小是512字节

在这里插入图片描述

所以我们把把整个磁盘文件的管理
细拆分为对一个扇区的管理!!!


4. 扇区中的块组是如何工作的?

每个扇区是512字节的大小,每个分区会
划分不同的块组,将所有的块组管理好也
就将整个磁盘管理好来了!

块组的基本结构:

在这里插入图片描述

  • inode Table保存对应文件的属性.每一个inode块都有一个inode编号,也就是说一个文件,一个inode,一个inode编号
  • Block Bitmap是个位图,表示特定的块组是否被使用
  • inode Bitmap也是个位图,表示特定的inode是否被占用
  • Data Blocks存储此文件的内容
  • GDT是块组描述符,表征这个块组有多大,已被使用了多少,有多少个inode,还剩多少个等等.
  • SuperBlock保存着文件系统的属性信息,每个块组都会备份一份,里面有每一个块组的信息

从今往后,要在磁盘中找到一个文件只需: 找到inode编号->分区特定的块组->inode->属性->内容
那么问题是文件的inode是什么我怎么知道?是的,
OS都考虑好了,在文件的目录中,存放着文件名和此文件的inode对应的映射关系,可以通过文件名直接找到inode!!!

在这里插入图片描述


5. 理解软硬链接

我们看到,真正找到磁盘上文件的并不是文件名,而是inode。 其实在linux中可以让多个文件名对应于同一个inode,这就是硬链接的原理

使用指令: ln 创建硬链接

使用方法: ln 已存在的文件 要创建的硬链接

在这里插入图片描述

可以发现,在创建硬链接前,test.cpp的引用计数是1,而创建硬链接后计数变成了2,其实硬链接的本质就是给相同的文件取别名,硬链接没有自己的inode,它和原文件的inode相同!请看下面的图片验证:

在这里插入图片描述

使用指令: ln -s 创建软连接

使用方法: ln -s 已存在的文件 要创建的硬链接
在这里插入图片描述

可以发现,创建的软连接是独立的一个文件,它有自己的inode,并且此软连接指向原文件,软链接相当于Windows下的创建快捷方式一样,它可以将文件路径很复杂的文件创建一个软链接到当前目录,想要使用原文件时,只需要使用软链接即可!


6. 理解动静态库

  • 静态库(.a结尾): 程序在编译链接时就把库的代码链接到可执行程序
  • 动态库(.so结尾): 程序运行时才去链接动态库的代码,动态库的代码是被共享的

gcc/g++默认使用的动态链接的方式,若
想要变为静态链接,在编译时加上-static

如何写一个自己的库?

.h文件写声明,.c写实现,将.c文件
编译成.o文件后,再将所有的.o文件
通过指针ar打包成一个库,将这个库
和.h文件放在同一目录,别人就能用了

制作静态库指令:

ar -rc libhello.a mymath.o myprintf.o

在这里插入图片描述
制作动态库指令:

gcc -shared myadd.o myprintf.o -o libhello.so

当别人要使用你写的库时,需要在编译
时带上选项-l加上你的库名,就像后面
在学习线程库时要加上选项-lpthread
,它的意思就是要使用pthread线程库


7. 总结

Linux的基础IO部分已经全部讲解
完毕,下一章将进入进程信号的学习.
掌握文件的inode相关知识可以更好
的帮助我们理解文件在打开和关闭时
分别是怎样运作的!


🔎 下期预告:Linux信号 🔍

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

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

相关文章

基于STM32的温室大棚环境检测及自动浇灌系统设计

需要全部资料请私信我! 基于STM32的温室大棚环境检测及自动浇灌系统设计 一、绪论1.1 研究背景及意义1.2 研究内容1.3 功能设计 二、系统方案设计2.1 总体方案设计 三、系统硬件设计3.1 STM32单片机最小系统3.2 环境温度检测电路设计3.3 土壤湿度检测电路设计3.4 光…

MySQL的事务机制

一、事务机制简述 事务机制,避免写入直接操作数据文件;利用日志来实现间接写入,与事务有关的, redo日志与undo日志;sql语句操作记录复制到undo日志然后增删改查操作的结果会记录在redo日志,如果操作没有什么问题就把数据同步到数…

Linux 抓包还不会?这篇文章赶紧收藏!

前言 什么是TCPDUMP TCPdump,全称dump the traffic on a network,是一个运行在linux平台可以根据使用者需求对网络上传输的数据包进行捕获的抓包工具。 tcpdump可以支持的功能: 1、在Linux平台将网络中传输的数据包全部捕获过来进行分析 …

k8s-调度 13

调度器通过 kubernetes 的 watch 机制来发现集群中新创建且尚未被调度到 Node 上的 Pod。调度器会将发现的每一个未调度的 Pod 调度到一个合适的 Node 上来运行。 kube-scheduler 是 Kubernetes 集群的默认调度器,并且是集群控制面的一部分。 如果你真的希望或者有…

分享一款刚开源的音乐人声分离工具!无需联网!页面化操作!

前言 人声分离 是一项重要的音频处理技术,它可以将混合音频中的 人声和背景音乐 分离出来,为音频处理和后期制作提供了便利。 随着人声分离技术的发展,越来越多的开源工具被开发出来,为音频处理领域带来了新的发展机遇。小编之前…

C# 图解教程 第5版 —— 第21章 异步编程

文章目录 21.1 什么是 异步21.2 async/await 特性的结构21.3 什么是异步方法21.3.1 异步方法的控制流21.3.2 取消一个异步操作21.3.3 在调用方法中同步地等待任务21.3.4 在异步方法中异步地等待任务21.3.5 Task.Delay 方法 21.4 GUI 程序中的异步操作(*)…

倒L天线设计

λ/4单极子天线具有工作带宽较宽,辐射效率较高的优点,但是其体积较大,随着无线终端设备的体积越来越小,对天线空间的要求也越来越严格,于是为了适应终端设备的发展,单极子天线开始出现一些变形,…

基于Python实现身份证信息识别

目录 前言身份证信息识别的背景与意义自动识别身份证的需求 实现环境与工具准备Python编程语言OpenCV图像处理库Tesseract OCR引擎 身份证信息识别算法原理图像预处理步骤(图像裁剪、灰度化 、二值化、去噪)信息提取与解析 Python代码实现通过OCR提取身份证号码代码解析身份证信…

SQL-修改数据

🎉欢迎您来到我的MySQL基础复习专栏 ☆* o(≧▽≦)o *☆哈喽~我是小小恶斯法克🍹 ✨博客主页:小小恶斯法克的博客 🎈该系列文章专栏:重拾MySQL 🍹文章作者技术和水平很有限,如果文中出现错误&am…

计算机毕业设计 | SSM 校园线上订餐系统(附源码)

1, 概述 1.1 项目背景 传统的外卖方式就是打电话预定,然而,在这种方式中,顾客往往通过餐厅散发的传单来获取餐厅的相关信息,通过电话来传达自己的订单信息,餐厅方面通过电话接受订单后,一般通…

【博士每天一篇论文-综述】Brain Inspired Computing : A Systematic Survey and Future Trends

阅读时间:2023-11-17 1 介绍 年份:2023 作者:李国琪 期刊:TechRxiv 引用量:2 这篇论文主要介绍了脑启发计算(Brain Inspired Computing,BIC)以及其在人工智能(Artifici…

MySQL安装服务启动失败解决方案

在安装MySQL中,应用配置阶段,显示服务启动失败 查看日志说服务启动失败 我的电脑是win764位 新装的操作系统,之前出现过权限不足的提示,首先定位故障为权限问题。由于MySQL80服务在 计算机管理->服务 里面显示户别为&#xff…

ubuntu20固定串口名称

查看串口的详细信息 udevadm info --name/dev/ttyUSB0结果: P: /devices/platform/scb/fd500000.pcie/pci0000:00/0000:00:00.0/0000:01:00.0/usb1/1-1/1-1.2/1-1.2:1.0/ttyUSB0/tty/ttyUSB0 N: ttyUSB0 L: 0 S: serial/by-id/usb-Silicon_Labs_CP2102_USB_to_UAR…

机器人持续学习基准LIBERO系列4——robosuite最基本demo

0.前置 机器人持续学习基准LIBERO系列1——基本介绍与安装测试机器人持续学习基准LIBERO系列2——路径与基准基本信息机器人持续学习基准LIBERO系列3——相机画面可视化及单步移动更新 1.robosuite的相关资料 是基于MuJoCo的机器人学习方针环境,提供一套基准环境…

2024.1.8 Day04_SparkCore_homeWork

目录 1. 简述Spark持久化中缓存和checkpoint检查点的区别 2 . 如何使用缓存和检查点? 3 . 代码题 浏览器Nginx案例 先进行数据清洗,做后续需求用 1、需求一:点击最多的前10个网站域名 2、需求二:用户最喜欢点击的页面排序TOP10 3、需求三&#x…

2024年最好用的简历编辑工具,助你腾飞职业生涯!

随着科技的不断发展,求职竞争也愈发激烈。在2024年,如何在众多求职者中脱颖而出成为关键问题。为了帮助大家在职业生涯中取得更好的机会,特别推荐一款在2024年最为出色的简历编辑工具——芊芊简历。 1. 创新的编辑功能 芊芊简历拥有直观易用…

Matlab 使用 DH table 建立的 robot 和实际不符

机器人仿真 想借助 matlab robotics toolbox 来仿真机器人,但是直接输入自己的 DH table 显示出来的 robot 和实际不情况不符。 DH table 建立 robot Build Manipulator Robot Using Kinematic DH Parameters 主要使用 setFixedTransform,DH table 中…

YOLOV7剪枝流程

YOLOV7剪枝流程 1、训练 1)划分数据集进行训练前的准备,按正常的划分流程即可 2)修改train.py文件 第一次处在参数列表里添加剪枝的参数,正常训练时设置为False,剪枝后微调时设置为True parser.add_argument(--pr…

POI:对Excel的基本写操作 整理1

首先导入相关依赖 <!-- https://mvnrepository.com/artifact/org.apache.poi/poi --><!--xls(03)--><dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>5.2.2</version></depend…

鸿蒙Harmony--状态管理器-@Observed装饰器和@ObjectLink装饰器详解

经历的越多&#xff0c;越喜欢简单的生活&#xff0c;干净的东西&#xff0c;清楚的感觉&#xff0c;有结果的事&#xff0c;和说到做到的人。把圈子变小&#xff0c;把语放缓&#xff0c;把心放宽&#xff0c;用心做好手边的事儿&#xff0c;该有的总会有的! 目录 一&#xff…