【linux】基础IO(三)

上一节基础IO我们着重理解了重定向与缓冲区,这节我们需要重点理解文件再磁盘中是怎样存储。以及上一节我们没有涉及到的知识。
stderr到时有什么用?

fd-> 0 1 2:

为什么我们的C语言要有fd为0 1 2的文件标识符呢。
我们知道0 是键盘,1 与 2是屏幕。
为什么1与2都是屏幕还要有两个ne?

我们一一来说。

首先对于0 与 1:
我们写的程序无非就是对数据进行处理(计算,存储…)
而这个过程也势必要被我们用户进行动态观察,方便我们与计算机的交互,这是自Unix操作系统出现时就约定成俗的,一直延续到现在,是历史原因造成的。

那么0与1容易理解,2如何理解呢?

初步理解2

我们先来看一段代码:
在这里插入图片描述
代码现象:
在这里插入图片描述
我们发现直接运行时会正常打印,但是重定向并没有全部重定向到log.txt中,向stderr中打印的仍旧在显示器上显示了。

所以,重定向的全名叫做标准输出重定向,完整写法是./myexe 1>log.txt,也就是只针对stdout这个流。

在这里插入图片描述
那么2存在的原因是什么?

当我们想查看一个程序的错误信息时,只需要重定向一下即可,可以加快我们的debug!

怎样将错误与正确输出都打印在一个文件?

将IO改一下,方便观看,多重复复制了一些打印语句。
在这里插入图片描述

我们先来看这样一个操作:
在这里插入图片描述
这样的操作容易理解。
那么这个操作呢?
在这里插入图片描述
我们分别理解一下:
对于第一种:
在这里插入图片描述
那么第二种是怎么理解?
2>&1:是对1取地址将1的内容给2。
在这里插入图片描述
现在我们回想一下在实现诗句结构时,我们经常使用的perror函数,他的本质就是想stderr中打印。在这里插入图片描述
我们的C++中除了cin cout,也有cerror函数,本质也是想stderr中打印。
在这里插入图片描述

在这里插入图片描述

所以,C++中的cerror和cout就像C的printf与perror!

文件在硬盘的存取:

在开始之前我们先普及一个概念,计算机只认识二进制,那么二进制有什么表现形式?有高低电平,像磁铁的南北极也可以代表0与1…
所以二进制在物理层面有不同的表现形式。

磁盘的样子:

在这里插入图片描述
每一个盘片都有两面,每面有一个磁头,盘片会旋转,磁头会左右摆动,至于这样做的原因我们稍后会说。

首先要知道我们现在的笔记本已经几乎不用磁盘,都是用SSD固态硬盘,因为盘片与磁头会挨着很近旋转,有灰尘杂质进入就会导致磁盘的损坏,所以很少采用磁盘去存储。

但是大型企业的服务器都是使用磁盘,主要是磁盘价格会相对便宜,容量大

那么本质上磁盘就是个机械设备。

了解磁盘的存储结构:

说了这么多,磁盘是怎样存储的呢?
磁盘表面很光滑,但是实际上是有数不清的小小磁铁构成的,我们知道 文件 = 内容 + 属性,但本质上他们都是数据,数据就是以二进制的形式进行存储在磁盘上。
前面也说过,0与1可以用磁铁的南北极来表示,在磁盘中就可以使用这种方法进行存储。

那既然是存储肯定就是有管理的存,不可能杂乱无章的存。
在这里插入图片描述
我们一个盘面 = n磁道,1磁道 = m扇区
由于我们的磁盘是由好多盘构成的,单单看磁道就像一个柱面一样,所以磁道也叫柱面。在这里插入图片描述
那么我们的磁盘读写的基本单位就是512byte(规定)
即使你想改其中的1bit也要将512字节全读到内存中在刷新到磁盘在这里插入图片描述
所以,我们可以现在对文件下一个定义。
文件就是在磁盘中占几个扇区的问题。

那么如何定位扇区呢?

  1. 找到指定面的磁头 - Header
  2. 找到指定的磁道 - Cylinder
  3. 找到指定的扇区 - Sector

也就是CHS定址法,如果你的文件有1000个扇区那OS存1000个CHS地址即可!
那么我们也就可以理解磁头与盘片的旋转与摆动了,是在寻找对应的磁道与扇区。

对磁盘的存储进行逻辑抽象:

为什么要进行抽象呢?直接采用CHS不可以吗

  1. 为了防止耦合度太高(硬盘换了操作系统也要跟着改)
  2. 也为了方便对磁盘的管理

相信我们都见过磁带,在这里插入图片描述
他们可以卷在一起形成圈,也可以散开形成一条线,所以,我们抽象就是将这几面盘面的大小抽象成一个线性数组!
在这里插入图片描述
我们在下一篇文章就可以知道文件系统的大概体系与其中的细节.
欲知后事如何,请看下回分解~

  • 6
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值