Linux 基础IO 三

1.close 关闭之后,文件内部没有数据

#include<stdio.h>
#include<string.h>
//#include<unistd.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>int main()
{close(1);int fd = open("log.txt", O_CREAT | O_TRUNC | O_RDONLY, 0666);if (fd < 0){perror("open");return 1;}printf("fd:%d\n", fd);//数据暂存在stdout的缓冲区中,无法到fd中,必须刷新一下;close(fd);//数据在缓冲区里面,但是对应的fd先关闭了,数据便无法刷新了;return 0;
}

2.stdout、stderr有什么区别;

2.1 1 和 2 对应的都是显示器文件,但是他们两个是不同的显示器文件,如同认为,同一个显示器文件,被打开了两次;  重定向输出,只会重定向标准输出流,不会改标准错误流;

2.2一般而言,如果程序运行有可能有问题的话,建议使用stderr  或cerr来打印;如果时常规文件内容,我们建议用stdout 或cout来打印

2.3

./test > ok.txt 2>err.txt  //运行test程序,把正确信息打给ok.txt,错误信息打给err.txt./test > log.txt 2>&1   //先指向log.txt,再把联想dup2函数,把1的指针给2;

 2.4  perror()  函数,会根据最近的调用的函数(失败)返回错误原因

3.文件系统与inode

3.1基础IO的I~III中的文件都是进程在内存中打开来操作的,那么还有在磁盘中未打开的文件;

3.2我们学习磁盘级别的文件,我们的侧重点在哪?这个文件在哪里?这个文件的属性是什么

站在系统的角度——一共多少个文件?各自的属性在哪里?如何快速找到?我还可以存储多少个文件?如何快速找到指定的文件?  如何进行对磁盘文件进行分门别类的存储?用来更好的存取

4.0磁盘文件——了解磁盘(B站有个up叫原理视界,可以简短看一下《发明机械硬盘的人真实牛逼》这个视频)

4.1内存——掉电易失存储介质

磁盘——永久性存储介质——SSD(固态硬盘)、U盘、flash卡,光盘、磁带。

磁盘是一个外设+是我们计算机中,唯一的机械设备——>速度慢(对比出来的)

4.2磁盘的结构:磁盘盘片、磁头、伺服系统,音圈马达……

盘面上会存储二进制——>计算机只认识二进制——>像磁盘写入,本质上就是改变磁盘的正负性;写入时磁头会带着电流改变磁盘上的正负性,从而把数据写入;

4.3磁盘并不像我们肉眼看到的那么光滑,它上面分布着各种同心圆,被称为磁道,磁道被划分为各种扇区;

4.4在物理上,如何把数据写入指定的扇区?磁盘存储数据的基本单位是扇区,512字节或4KB(硬件上的要求)(现在的技术已经做到,即使扇区的大小不一,存储数据单位都是512字节,是通过改变密度实现的)

4.4.1在哪一个面上?(对应的哪一个磁头);在哪一个磁道上?在哪一个扇区?

这种寻址方式叫CHS寻址,如果我们有了chs,就能找到任意一个扇区,那么所有的扇区我们就能找到了。可以利用位图来解决这种事;

4.5操作系统会使用LBA(请百度一下,这里就不复制了)的方式去变成CHS来访问磁盘扇区

4.5.1  磁盘的逻辑结构

将数据存储到磁盘——>将数据存储到数组——>找到磁盘特定扇区的位置——>找到数组特定的位置——>对磁盘的管理,变成了对数组的管理

如果说,一个磁盘500个G太大了,那就分区,分成5个100G的——>对磁盘的管理,就变成了对一个分区的管理;

4.5.2虽然磁盘的基本单位事扇区(512字节)但是操作系统(文件系统)和磁盘IO的基本单位是4KB——为什么比512字节大呢?答:1.512太小了,有可能会导致多次IO,进而导致效率的降低 2.如果操作系统使用和磁盘一样的大小,万一磁盘的基本大小变了的话,OS的源代码要不要改变呢?硬件和软件(OS)进行解耦;  

4.5.3因为4KB被称为块大小,所以磁盘称为块设备

4.5.4 Data blocks :多个4KB(扇区*8)大小的集合,保存的都是特定文件的内容

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

4.5.6inode table:inode是一个大小为128字节的空间,保存的是对应文件的属性;inode table 是分组和该块组内,所有文件inode空间的集合,需要标识唯一性,每一个inode块都要有一个inode编号;一般而言,一个文件有一个inode,一个inode编号

4.5.7BlockBitmap:块位图,用来查看哪个Data block 存储有数据,哪个没有数据二者是一一对应的,其中比特位1,代表该block被占用,否则代表可用;

4.5.8 inode Bitmap :inode位图 ;  假设有10000个inode节点,就有10000个比特位,比特位和特定的inode是一一对应的,其中bitmap中比特位为1,代表inode被占用,否则表示可用;

4.5.9 GDT:块组描述符:这个块组多大,已经使用了多少,有多少个inode,已经占用了多少个?还剩多少  等等等等……

4.5.10超级块(Super Block):存放文件系统本身的结构信息。记录的信息主要有:bolck inode的总量, 未使用的blockinode的数量,一个blockinode的大小,最近一次挂载的时间,最近一次写入数据的 时间,最近一次检验磁盘的时间等其他文件系统的相关信息。Super Block的信息被破坏,可以说整个 文件系统结构就被破坏了

以上的基本信息,就可以让一个块组的信息可管理,可追溯,管理好一个,就可以管理好多个

4.5.11我们讲块组分割成为上面的内容,并且写入相关的管理数据——>每个块组都这么干——>整个分区都被写入了文件系统信息——这个过程叫格式化;

4.6一个文件对应一个inode属性节点,inode编号;但是一个文件不止有一个data block

4.6.1怎样判断哪些block属于同一个文件?答:

4.6.2查找文件,只要找到文件对应的inode编号,就能找到该文件的inode属性集合,可是文件的内容呢?答:inode中有一个struct inode 里面有文件大小,inode编号,同时还有占据的数据块的编号(回答4.6.1)根据映射找到数据块

4.6.3如果这个文件巨大?

data block中,不是所都得数据块,只能存储数据,也可以存储其他块的块号;采用间接索引的方式可以找到大量的数据块

4.7想找到文件——>找到inode编号——>找到分区特定的块组——>inode——>属性——>内容

我们怎样知道inode编号呢?

Linux中,inode属性里面,没有文件名这样的说法;

4.7.1 一个目录下,可以保存很多文件,但是这些文件没有重复的文件名

4.7.2目录也是文件——>有自己的inode,有自己的data block,data block里面存储的是文件名 以及和inode编号的映射关系;因为具有唯一性,互为key值

4.8 创建文件,系统做了什么?

删除文件,系统做了什么?

查看文件,系统做了什么?

4.9我们在世纪的过程中会遇到以下情况:磁盘还有空间,但是创建不了文件,写不进去内容,原因就是inode没有空间了,或者是没有数据块了

5.软硬链接

软连接有独立的inode ——>软连接是一个独立的文件:软连接的文件内容,是指向文件的对应路径

硬链接没有独立的inode——>硬链接不是一个独立的文件:在指定的目录下建立了文件名 和 指定inode的映射关系 ——仅此而已(起别名,智能指针的引用计数)

ln -s  文件名 文件名  //软连接——相当于windous下的快捷方式
ln 文件名 文件名  //硬链接

5.1默认创建目录,引用计数(硬链接)为啥是2呢?是因为自己的目录名:inode;自己目录内部有一个 点,他和对应的inode有映射关系,所以引用计数是2;

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

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

相关文章

c++模板模式

文章目录 模板模式什么是模板模式为什么使用模板模式模板模式实现步骤 示例模板模式优缺点 模板模式 什么是模板模式 模板模式&#xff08;Template Method Pattern&#xff09;是一种行为设计模式&#xff0c;它定义了一个操作中的算法骨架&#xff0c;将某些步骤的具体实现延…

[DDR4] DDR 简史

依公知及经验整理&#xff0c;原创保护&#xff0c;禁止转载。 专栏 《深入理解DDR4》 存和硬盘&#xff0c;这对电脑的左膀右臂&#xff0c;共同扛起了存储的重任。内存以其超凡的存取速度闻名&#xff0c;但一旦断电&#xff0c;内存中的数据也会消失。它就像我们的工作桌面&…

tokenization(二)子词切分方法

文章目录 概述BPE构建词表词元化代码实现 WordPieceUnigram估算概率&#xff08;E&#xff09;删除词元&#xff08;M&#xff09; 参考资料 概述 接上回&#xff0c;子词词元化&#xff08;Subwords tokenization&#xff09;是平衡字符级别和词级别的一种方法&#xff0c;也…

网络通信架构

BS架构/CS架构 使用协议分别对应&#xff1a; TCP / HTTP 在计算机网络和软件开发中&#xff0c;CS架构&#xff08;Client-Server Architecture&#xff0c;客户端-服务器架构&#xff09;和BS架构&#xff08;Browser-Server Architecture&#xff0c;浏览器-服务器架构&am…

云和运维(SRE)的半生缘-深读实证02

这个标题不算太夸张&#xff0c;云计算和很多IT岗位都有缘&#xff0c;但是和运维&#xff08;SRE&#xff09;岗位的缘分最深。 “深读实证”系列文章都会结合一些外部事件&#xff0c;点明分析《云计算行业进阶指南》书中的内容。本次分享介绍了下列内容&#xff1a; 我以运维…

Matlab电话按键拨号器设计

前言 这篇文章是目前最详细的 Matlab 电话按键拨号器设计开源教程。如果您在做课程设计或实验时需要参考本文章&#xff0c;请注意避免与他人重复&#xff0c;小心撞车。博主做这个也是因为实验所需&#xff0c;我在这方面只是初学者&#xff0c;但实际上&#xff0c;从完全不…

ffmpeg学习

学习视频 帧率 帧率也叫做帧频率&#xff0c;帧率是视频文件中每一秒的帧数&#xff0c;肉眼想看到连续移动图像至少需要15帧。 码率 比特率&#xff08;也叫码率&#xff0c;数据率&#xff09;是一个确定整体视频/音频质量的参数&#xff0c;秒为单位处理的字节数&#x…

USB2.0高速转接芯片CH347应用开发手册

CH347应用开发手册 V1.3 一、简介 CH347是一款USB2.0高速转接芯片&#xff0c;以实现USB-UART(HID串口/VCP串口)、USB-SPI、USB-I2C、USB-JTAG以及USB-GPIO等接口&#xff0c;分别包含在芯片的四种工作模式中。 CH347DLL用于为CH347芯片提供操作系统端的UART/SPI/I2C/JTAG/B…

测试开发工程师<职业规划方向>

测试开发工程师的职业规划 一、引言 测试开发工程师是软件开发团队中不可或缺的角色&#xff0c;他们负责确保软件的质量和稳定性。随着软件行业的快速发展&#xff0c;测试开发工程师的职业前景也越来越广阔。本文将详细探讨测试开发工程师的职业规划&#xff0c;包括可能的职…

Python:线性查找法

什么是线性搜索算法&#xff1f; 线性搜索算法是一种基本的搜索技术&#xff0c;用于查找目标元素是否存在于一个集合&#xff08;通常是列表或数组&#xff09;中。该算法的工作原理非常简单&#xff1a;它从集合的第一个元素开始逐个检查&#xff0c;直到找到目标元素或遍历完…

Linux_应用篇(17) FrameBuffer 应用编程

本章学习 Linux 下的 Framebuffer 应用编程&#xff0c; 通过对本章内容的学习&#xff0c; 大家将会了解到 Framebuffer 设备究竟是什么&#xff1f;以及如何编写应用程序来操控 FrameBuffer 设备。 本章将会讨论如下主题。 ⚫ 什么是 Framebuffer 设备&#xff1f; ⚫ LCD 显…

git:切换到指定的commit

背景 今天合并人家代码的时候&#xff0c;报冲突了&#xff0c;然后解决完冲突以后&#xff0c;发现有个冲突干错了&#xff0c;但是都已经commit了&#xff0c;所以我就想那就回到这次merge之前的我的分支的commit 解决过程 取消合并 我先查了能否直接取消合并&#xff0c…

N32G031 ADC初始化

目录 1. ADC初始化概述 2. ADC初始化详细步骤 2.1 ADC配置 2.2 ADC初始化函数调用 2.3 DMA配置&#xff08;可选&#xff09; 3. 初始化结果验证 4. 注意事项 ADC采样注意事项 1. ADC初始化概述 在N32G031单片机中&#xff0c;ADC的初始化是确保ADC模块能够正常工作的…

JS中判断一个字符串中出现次数最多的字符,统计这个次数?

在JavaScript中&#xff0c;要判断一个字符串中出现次数最多的字符并统计这个次数&#xff0c;你可以通过创建一个对象来记录每个字符出现的次数&#xff0c;然后遍历这个对象以找到出现次数最多的字符。下面是一个简单的示例代码&#xff1a; function findMostFrequentChar(…

安卓在Fragment控制状态栏显示隐藏

废话不多上效果 隐藏 显示 核心代码 首先是Framgrent package com.zx.tab;import android.content.Context; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.Button;impor…

【redis】Redis的经典使用场景

目录 1.最常见——缓存2.数据共享分布式3.分布式锁4.全局ID5.计数器6.限流7.位统计8.购物车9.用户消息时间线timeline10.消息队列11.抽奖点赞、签到、打卡13.商品标签14.商品筛选15.用户关注、推荐模型16排行榜 1.最常见——缓存 数据类型&#xff1a;string例如&#xff1a;热…

给Windows软件添加异常捕获模块生成dump文件(附源码)

软件在运行过程中会时常发生内存越界、内存访问为例、stack overflow线程栈溢出、空指针与野指针等异常崩溃,仅仅是依靠Debug和Release下的调试是远远不够的,因为有些崩溃不是必现的,或者是Debug下很难出现的。所以我们需要在软件中添加异常捕获的模块,在捕获到异常时生成包…

1、C++编程中的基本运算 - 课件

一、基础知识 1、C程序的基本框架 // 预处理器指令&#xff0c;引入需要的头文件 #include <iostream> // 使用标准命名空间 using namespace std; // 主函数&#xff0c;程序的入口 int main() {// 局部变量声明// 程序逻辑代码// 返回值&#xff0c;表示程序正常结束…

C 语言连接MySQL 数据库

前提条件 本机安装MySQL 8 数据库 整体步骤 第一步&#xff1a;开启Windows 子系统安装Ubuntu 22.04.4&#xff0c;安装MySQL 数据库第三方库执行 如下命令&#xff1a; sudo aptitude install libmysqlclient-dev wz2012LAPTOP-8R0KHL88:/mnt/e/vsCode/cpro$ sudo aptit…

鸿蒙求职面试内容总结——6月3日ZR的FS项目

最近接到了一些公司的入职面试邀约&#xff0c;这里略去公司的和项目的名字&#xff0c;做一些整理分享。 一、长列表如何实现部分渲染&#xff0c;使用的是哪一个API 在鸿蒙系统中&#xff0c;可以使用List组件来实现长列表的部分渲染。List组件支持使用条件渲染、循环渲染、…