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;

相关推荐

  1. Linux 基础IO

    2024-06-17 08:42:02       29 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-06-17 08:42:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-06-17 08:42:02       100 阅读
  3. 在Django里面运行非项目文件

    2024-06-17 08:42:02       82 阅读
  4. Python语言-面向对象

    2024-06-17 08:42:02       91 阅读

热门阅读

  1. 你应该知道的口语连读技巧

    2024-06-17 08:42:02       35 阅读
  2. Rust创建基准测试bench

    2024-06-17 08:42:02       31 阅读
  3. AWS无服务器 应用程序开发—第十三章 小结2

    2024-06-17 08:42:02       33 阅读
  4. 迁移学习和从头训练(from scratch)的区别

    2024-06-17 08:42:02       25 阅读
  5. Conda编译

    2024-06-17 08:42:02       30 阅读
  6. Linux 常用命令 - userdel 【删除用户】

    2024-06-17 08:42:02       33 阅读
  7. SQL COUNT() 函数深入解析

    2024-06-17 08:42:02       25 阅读
  8. MySQL入门学习-子查询.ALL

    2024-06-17 08:42:02       30 阅读
  9. 快速排序压缩算法2024年最新一种压缩算法

    2024-06-17 08:42:02       27 阅读
  10. 第66集《摄大乘论》

    2024-06-17 08:42:02       22 阅读