【Linux基础IO篇】用户缓冲区、文件系统、以及软硬链接

【Linux基础IO篇】用户缓冲区、文件系统、以及软硬链接

目录

  • 【Linux基础IO篇】用户缓冲区、文件系统、以及软硬链接
      • 深入理解用户缓冲区
        • 缓冲区刷新问题
        • 缓冲区存在的意义
      • File
        • 模拟实现C语言中文件标准库
      • 文件系统
        • 认识磁盘
        • 对目录的理解
      • 软硬链接
        • 软硬链接的删除
        • 文件的三个时间

作者:爱写代码的刚子

时间:2023.11.5

前言:本篇博客将介绍缓冲区、磁盘的构成、分区,以及文件系统中的结构、软硬链接

深入理解用户缓冲区

观察几个现象:

正常现象一:

在这里插入图片描述

现象二:

在这里插入图片描述

现象三:

在这里插入图片描述

图示:
在这里插入图片描述

解释现象

  1. 对于现象二:C语言文件操作函数中的字符串不带有’\n’,即数据还停留在C语言的缓冲区中,并未刷新和调用write()函数,将数据刷新到内核系统文件的缓冲区中,而write()函数由于是系统调用函数,能正常执行,但是由于close()函数将显示器文件关闭了,即使进程结束也不能将数据从缓冲区刷新到显示器中。(如果将close函数屏蔽,将会将C语言缓冲区中的数据刷新到显示器)

  2. 对于现象三:(1)在程序未进行重定向之前,默认是将数据写入显示器中,当遇到’\n’时,将数据从C语言的缓冲区中刷新到内核文件系统的缓冲区,fork()并不影响原本程序的运行。(2)在程序进行重定向之后,数据从向显示器写入变为了向文件中写入,缓冲区从行缓冲变为了全缓冲,所以此时的’\n’并不起作用,所以数据依然存储在C语言的缓冲区中,fork()函数创建子进程时子进程会将父进程的C语言缓冲区进行拷贝,当父子进程结束后将缓冲区里面的内容全部刷新,输出到显示器中。

  • 显示器的文件的刷新方案是行刷新,所以在printf执行完就会在遇到’\n’的时候会立即进行刷新,用户刷新的本质就是将数据通过1+write写入到内核中。(目前我们认为,只要将数据刷新到了内核,数据就可以到硬件了)。
缓冲区刷新问题
  1. 无缓冲 ——直接刷新
  2. 行缓冲——不刷新,碰到’\n’刷新(显示器)
  3. 全缓冲——缓冲区满了才刷新(普通文件的写入)
  4. 进程退出的时候也会刷新缓冲区
缓冲区存在的意义
  1. 解决效率问题
  2. 配合格式化(printf中需要将%d等符号进行替换)

File

FILE里面含有对应打开文件等缓冲区字段和维护信息,同时FILE对象属于用户,这个缓冲区属于用户级缓冲区(语言属于用户层)

模拟实现C语言中文件标准库
  • Mystdio.h文件:
#ifndef __MYSTDIO_H__
#define __MYSTDIO_H__
//open头文件
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
//
#include <unistd.h>
//
#include <string.h>
#include <stdlib.h>#define FILE_MODE 0666
#define SIZE 1024#define FLUSH_NOW 1//0001
#define FLUSH_LINE 2//0010
#define FLUSH_ALL 4//0100typedef struct IO_FILE{int fileno;int flag;char inbuffer[SIZE];int in_pos;char outbuffer[SIZE];int out_pos;//缓冲区的有效字符和无效字符分界
}_FILE;_FILE* _fopen(const char* filename,const char* flag);
int _fwrite(_FILE *fp,const char*s,int len);
void _fclose(_FILE *fp);#endif
  • Mystdio.c文件:
#include "Mystdio.h"_FILE* _fopen(const char* filename,const char* flag)
{int f=0;int fd=-1;if(strcmp(flag,"w")==0){f=O_CREAT|O_WRONLY|O_TRUNC;fd= open(filename,f,FILE_MODE);}else if(strcmp(flag,"r")==0){f=O_CREAT|O_RDONLY|O_TRUNC;fd= open(filename,f,FILE_MODE);}else if(strcmp(flag,"a")==0){f=O_APPEND;fd= open(filename,f);}else{return NULL;}if(fd==-1) return NULL;//创建文件结构对象_FILE* fp=(_FILE*)malloc(sizeof(_FILE));if(fp==NULL)return  NULL;fp->fileno = fd;fp->flag= FLUSH_LINE;fp->out_pos=0;return fp;
}
int _fwrite(_FILE *fp,const char*s,int len)
{memcpy(&fp->outbuffer[fp->out_pos],s,len);//这里省略了异常处理fp->out_pos+=len;if(fp->flag & FLUSH_NOW){write(fp->fileno,fp->outbuffer,fp->out_pos);fp->out_pos=0;}else if(fp->flag & FLUSH_LINE){if(fp->outbuffer[fp->out_pos-1]=='\n')//'\n'可能出现在字符中间,这时候需要对字符串做裁剪{write(fp->fileno,fp->outbuffer,fp->out_pos);fp->out_pos=0;}}else if(fp->flag & FLUSH_ALL){if(fp->out_pos==SIZE){write(fp->fileno,fp->outbuffer,fp->out_pos);//全写出去fp->out_pos=0;}}return len;//成功写入的长度
}
void _fflush(_FILE *fp)
{if(fp->out_pos>0){write(fp->fileno,fp->outbuffer,fp->out_pos);fp->out_pos=0;}
}
void _fclose(_FILE *fp)
{if(fp==NULL)return ;_fflush(fp);close(fp->fileno);free(fp);
}

Main.c文件:

#include "Mystdio.h"#define myfile "test.txt"
int main()
{_FILE* fp=_fopen(myfile,"w");if(fp==NULL){return 1;}int cnt =10;while(cnt--){const char* msage = "hello Linux\n";_fwrite(fp,msage,strlen(msage));sleep(1);}//_fflush(fp)return 0;
}

测试

makefile文件:

在这里插入图片描述

while :;do cat test.txt;sleep 1;echo “----------------------”;done持续打印文件内容

在这里插入图片描述

一般C库函数写入文件时是全缓冲的,而写入显示器是行缓冲。 printf fwrite 库函数会自带缓冲区(进度条例子就可以说明),当发生重定向到普通文件时,数据的缓冲方式由行缓冲变成了全缓冲。而我们放在缓冲区中的数据,就不会被立即刷新,甚至fork之后 但是进程退出之后,会统一刷新,写入文件当中。 但是fork的时候,父子数据会发生写时拷贝,所以当你父进程准备刷新的时候,子进程也就有了同样的 一份数据,随即产生两份数据。write没有变化,说明没有所谓的缓冲。

printf fwrite 库函数会自带缓冲区(用户级缓冲区),而 write系统调用没有带缓冲区。(为了提升整机性能,OS也会提供相关内核级缓冲区)

文件系统

认识磁盘

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

  • 磁头是一面一个,磁头和盘面不接触,磁头臂会进行摆动来定位柱面或磁道(磁臂运动越少,效率越高,反之越低),所以在软件设计上一定要有意识将相关数据放在一起

磁盘的逻辑结构是线性的(对磁盘理解和建模)

在这里插入图片描述

  • 扇区的一般大小是512字节或者4kb

不仅CPU有寄存器,其他设备(外设)也存在寄存器

在这里插入图片描述

对磁盘进行分区

在这里插入图片描述

关于inode中的block数组:

inode中有struct inode结构体,里面包括了文件所有的属性,和一个blocks[15]数组,其中的下标[0, 11]直接保存的就是该文件对应的blocks编号,下标[12, 15]指向一个datablock,但是这个datablock不保存有效数据,而保存文件所适用的其它块的编号。(相当于一个二级索引)

stat +文件名查看文件的具体信息

在这里插入图片描述

ls -lia查看所有文件的信息(包括文件的inode)

ls -i查看当前目录下各文件的inode编号

在这里插入图片描述

启动块的大小是确定的,而块组的大小是由格式化的时候确定的,并且不可以更改。
文件 = 内容 + 属性,二者都是数据,都要存储。Linux采用的是将内容和属性数据分开存储的方案,内容在block中(4KB),内容是可以无限增多的。属性数据在inode中(128字节),文件的属性是稳定的。

注意一个要点,inode可能会存在用完的情况

  • Linux系统中,一个文件一个inode,每一个inode。每一个inode都有自己的inode编号(inode的设置是以分区为单位的,不能跨分区)
对目录的理解

Linux下一切皆文件,目录也是一个文件,通过文件名(对应的inode编号)-> 找到自己所处的目录 -> 根据目录的inode,找到目录的data block -> 将文件名和inode编号的映射关系写入到目录的数据块中。

在这里插入图片描述

在这里插入图片描述

  • 问题1:为什么同一个目录下不能存在同名文件?

因为一个文件只存在一个inode,文件名是作为key值去找inode的,如果存在同名文件就会破坏对应的映射关系。

  • 问题2:为什么没有w权限就不能创建文件?

即便是能创建文件,也不能将该文件与inode的映射关系写到数据块中。

  • 问题3:为什么没有r权限就不能查看文件?

无法拿到该目录文件中文件与inode之间的映射关系

  • 问题4:为什么没有x权限就不能进入目录?

不让用户更改环境变量中的目录信息

查找任何一个文件时,我们必须从当前目录递归到根目录,然后从根目录信息中查找对应子目录的inode信息(效率会低)

所以Linux中会存在提升效率的方法,将常用的路径信息进行缓存(dentry缓存,里面的结构算法较复杂)

软硬链接

建立软链接

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

软链接的inode不同

软连接又叫符号链接,软连接文件相当于源文件来说是一个独立的文件,该文件有自己的inode号,但是该文件只包含了源文件的路径名,所以软连接文件的大小要比源文件小得多。软连接就类似于Windows操作系统当中的快捷方式。软链接保存的是对应文件的所在路径

ln -s 对应的路径 软链接的名字添加快捷方式

建立硬链接

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

硬链接的inode相同,同时文件的引用计数变为了2

  • 硬连接数本质就是该文件inode属性中的计数器count,标识有几个文件名和我的inode建立了映射关系。简言之,就是有几个文件名指向我的inode(文件本身)硬链接就是让多个不在或者同在一个目录下的文件名,同时能够修改同一个文件,其中一个修改后,所有与其有硬链接的文件都一起修改了。

为什么文件被创建出来,默认的硬连接数是1?

  • 如果硬链接数是0,那么就应该是被关闭的文件了,所以至少应该从1开始。此外,普通文件的文件名,本身就和自己的inode具有映射关系,且只有1个,所以文件的默认硬连接数是1。

创建一个新目录时引用计数默认为2

在这里插入图片描述

在这里插入图片描述

  • 我们也可以根据系统的硬连接数,不进入文件,从而估算出文件的目录数(一个目录下相邻的子目录数 = 该目录的硬连接数 - 2)。因此,硬链接的一个作用就是进行路径切换
软硬链接的删除

unlink(unlink也可以删除普通文件,与rm没什么区别)

在这里插入图片描述

文件的三个时间

在这里插入图片描述

这其中包含了文件的三个时间信息:

  • Access: 文件最后被访问的时间。
  • Modify: 文件内容最后的修改时间。
  • Change: 文件属性最后的修改时间。

当我们修改文件内容时,文件的大小一般会随之改变,所以Modify的改变会带动Change一起改变,但对该文件属性一般不会影响文件内容,所以一般情况下Change的改变不会带动Modify的改变。此外,我们可以使用touch命令把这三个时间都更新到最新状态。(当一文件存在时使用touch命令,此时touch命令的作用变为更新文件信息)。

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

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

相关文章

2023.11.11 hive中的内外部表的区别

一.内部表操作 ------------------------------1内部---------------------------- --建库 create database hive2; --用库 use hive2; --删表 drop table t1; --建表 create table if not exists t1(id int,name string,gender string ); --复制内部表 --复制表结构:CREATE T…

计算机视觉中目标检测的数据预处理

本文涵盖了在解决计算机视觉中的目标检测问题时&#xff0c;对图像数据执行的预处理步骤。 首先&#xff0c;让我们从计算机视觉中为目标检测选择正确的数据开始。在选择计算机视觉中的目标检测最佳图像时&#xff0c;您需要选择那些在训练强大且准确的模型方面提供最大价值的图…

基于ubuntu 22, jdk 8x64搭建图数据库环境 hugegraph--google镜像chatgpt

基于ubuntu 22, jdk 8x64搭建图数据库环境 hugegraph download 环境 uname -a #Linux whiltez 5.15.0-46-generic #49-Ubuntu SMP Thu Aug 4 18:03:25 UTC 2022 x86_64 x86_64 x86_64 GNU/Linuxwhich javac #/adoptopen-jdk8u332-b09/bin/javac which java #/adoptopen-jdk8u33…

2023年05月 Python(四级)真题解析#中国电子学会#全国青少年软件编程等级考试

Python等级考试(1~6级)全部真题・点这里 一、单选题(共25题,每题2分,共50分) 第1题 下列程序段的运行结果是?( ) def s(n):if n==0:return 1else:

畅通工程之局部最小花费问题 (C++)

目录 题目&#xff1a; 思路&#xff1a; 代码&#xff1a; 结果 题目&#xff1a; 思路&#xff1a; 详细思路都在代码注释里 。 代码&#xff1a; #include<iostream>//无向图邻接矩阵 #include<map> #include<algorithm> #define mvnum 1005 using …

​​​​​​​​​​​​​​汽车网络信息安全分析方法论

目录 1.典型信息安全分析方法 1.1 HEAVENS威胁分析模型 1.2 OCTAVE威胁分析方法 1.3 Attack Trees分析方法 2. 功能安全与信息安全的关系讨论 与Safety的典型分析方法一样&#xff0c;Security也有一些典型的信息安全威胁分析方法(TARA分析)&#xff0c;根据SAE J3061、I…

cortex-A7核 中断实验(按键中断实验)

1.选择按键触发方式 下降沿 2.解决消抖的方法 1&#xff09;ARM中&#xff1a;延时消抖 2&#xff09;linux驱动开发&#xff1a;定时器函数 3.框图 内部流程框图&#xff1a; 需要RCC GPIO EXTI GIC章节 中断触发流程&#xff1a; 4.RCC 章节 1&#xff09;使能GPIOF组 …

如何更好的使用Copilot

Copilot从诞生到现在过去了挺长时间了&#xff0c;大家对Copilot的评价算是褒贬不一吧。有些人觉得Copilot高效且神奇&#xff0c;可以对自己的工作大大提效&#xff1b;有些觉得也就那样&#xff0c;为什么要花那么多钱做这个事情&#xff0c;钱它不香吗&#xff1f; 从最开始…

nodejs+vue+python+PHP+微信小程序-安卓- 基于小程序的高校后勤管理系统-计算机毕业设计

目 录 摘 要 I ABSTRACT II 目 录 II 第1章 绪论 1 1.1背景及意义 1 1.2 国内外研究概况 1 1.3 研究的内容 1 第2章 相关技术 3 2.1 nodejs简介 4 2.2 express框架介绍 6 2.4 MySQL数据库 4 第3章 系统分析 5 3.1 需求分析 5 3.2 系统可行性分析 5 3.2.1技术可行性&#xff1a;…

SQL 聚合函数

前言 SQL中的聚合函数是对一组值执行计算&#xff0c;并返回单个值的函数。 常用的聚合函数有&#xff1a; 函数作用AVG&#xff08;&#xff09;求平均值MAX&#xff08;&#xff09;求最大值MIN&#xff08;&#xff09;求最小值SUM&#xff08;&#xff09;求和COUNT&…

Python开源项目RestoreFormer(++)——人脸重建(Face Restoration),模糊清晰、划痕修复及黑白上色的实践

有关 Python 和 Anaconda 及 RestoreFormer 运行环境的安装与设置请参阅&#xff1a; Python开源项目CodeFormer——人脸重建&#xff08;Face Restoration&#xff09;&#xff0c;模糊清晰、划痕修复及黑白上色的实践https://blog.csdn.net/beijinghorn/article/details/134…

25期代码随想录算法训练营第十四天 | 二叉树 | 递归遍历、迭代遍历

目录 递归遍历前序遍历中序遍历后序遍历 迭代遍历前序遍历中序遍历后序遍历 递归遍历 前序遍历 # Definition for a binary tree node. # class TreeNode: # def __init__(self, val0, leftNone, rightNone): # self.val val # self.left left # …

CSS的初步学习

CSS 层叠样式表 (Cascading Style Sheets). CSS 能够对网页中元素位置的排版进行像素级精确控制, 实现美化页面的效果. 能够做到页面的样式和结 构分离. CSS 就是 “东方四大邪术” 之化妆术 CSS 基本语法规范: 选择器 若干属性声明 选择器决定针对谁修改 (找谁) 声明决定修…

webrtc推拉流 srs报错:DTLS_HANG DTLS: > Hang, done=0, version=-1, arq=0

执行了./objs/srs -c conf/rtc.conf 打开了srs的推拉流网页&#xff1a; 推流 拉流 srs报错如下&#xff1a; [2023-11-08 21:55:23.489][Warn][44992][8xvf4d62][104][DTLS_HANG] DTLS: Hang, done0, version-1, arq0 观看srs日志&#xff0c;在sdp offer&#xff0c;answer…

MySQL中的json使用注意

MySQL中json是一种重要的数据类型 好的点在于其不必事先定义列得名称啥的 不过不要将明显的关系型数据作为json来存储&#xff0c;例如用户余额、姓名、身份证等&#xff0c;这些是用户必须包含的数据 json适合存储的是给每个用户&#xff08;或者物品&#xff09;打的标签&…

MySQL Command Line Client 运行闪退问题解决,缺少my.ini文件

MySQL Command Line Client 运行闪退问题解决&#xff1a; 问题排查&#xff1a; 1.找到Command Line Client的路径位置&#xff0c;并查看属性&#xff0c;步骤截图&#xff1a; 查看属性&#xff1a; 查看属性中的目标路径&#xff1a; 2.进入属性中的目标路径&#xff0c;…

最新支付宝转卡码生成之转账源代码(隐藏部分卡号)

一、需要准备好自己的卡号、名称、以及对应的姓名 二、然后将自己的信息填入下面的代码中 三、然后将拼接好的代码&#xff0c;利用转码技术生产对应的二维码 四、这样一个跳转银行卡二维码的转账码就做好了 效果演示&#xff1a;如下 支付宝扫码、跳转码、转卡码、隐藏卡号…

51单片机应用从零开始(一)

1. 单片机在哪里 单片机是一种集成电路芯片&#xff0c;通常被嵌入到电子设备中用于控制和处理数据&#xff0c;例如家电、汽车、电子玩具、智能家居等。因此&#xff0c;你可以在许多电子设备中找到单片机的存在。单片机通常被放置在设备的主板或控制板上。 2. 单片机是什么…

对Mysql和应用微服务做TPS压力测试

1.对Mysql 使用工具&#xff1a;mysqlslap工具 使用命令&#xff1a; mysqlslap -uroot pGG8697000!#--auto generate sql -auto generate sql-load typemixed-concurrency100,200 - number of queries1000-iterations10 - number-int-cols7 - number-charcols13auto genera…

PDF Expert for mac(专业pdf编辑器)苹果电脑

PDF Expert for Mac 是一款功能强大、界面简洁的PDF阅读、编辑和转换工具&#xff0c;为Mac用户提供了全面而便捷的PDF处理体验。无论是日常工作中的文档阅读、标注&#xff0c;还是专业需求下的编辑、转换&#xff0c;PDF Expert 都能满足您的各种需求。 首先&#xff0c;PDF…