网站建设 管理,怎么成立网站,网站建设项目进度表,网站 搜索怎么实现上一节基础IO我们着重理解了重定向与缓冲区#xff0c;这节我们需要重点理解文件再磁盘中是怎样存储。以及上一节我们没有涉及到的知识。 stderr到时有什么用#xff1f; 目录 fd- 0 1 2#xff1a;初步理解2怎样将错误与正确输出都打印在一个文件#xff1f; 文件在硬…上一节基础IO我们着重理解了重定向与缓冲区这节我们需要重点理解文件再磁盘中是怎样存储。以及上一节我们没有涉及到的知识。 stderr到时有什么用 目录 fd- 0 1 2初步理解2怎样将错误与正确输出都打印在一个文件 文件在硬盘的存取磁盘的样子了解磁盘的存储结构对磁盘的存储进行逻辑抽象 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 1log.txt也就是只针对stdout这个流。 那么2存在的原因是什么
当我们想查看一个程序的错误信息时只需要重定向一下即可可以加快我们的debug
怎样将错误与正确输出都打印在一个文件
将IO改一下方便观看多重复复制了一些打印语句。
我们先来看这样一个操作 这样的操作容易理解。 那么这个操作呢 我们分别理解一下 对于第一种 那么第二种是怎么理解 21是对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字节全读到内存中在刷新到磁盘 所以我们可以现在对文件下一个定义。 文件就是在磁盘中占几个扇区的问题。
那么如何定位扇区呢
找到指定面的磁头 - Header找到指定的磁道 - Cylinder找到指定的扇区 - Sector
也就是CHS定址法如果你的文件有1000个扇区那OS存1000个CHS地址即可 那么我们也就可以理解磁头与盘片的旋转与摆动了是在寻找对应的磁道与扇区。
对磁盘的存储进行逻辑抽象
为什么要进行抽象呢直接采用CHS不可以吗
为了防止耦合度太高硬盘换了操作系统也要跟着改也为了方便对磁盘的管理
相信我们都见过磁带 他们可以卷在一起形成圈也可以散开形成一条线所以我们抽象就是将这几面盘面的大小抽象成一个线性数组 我们在下一篇文章就可以知道文件系统的大概体系与其中的细节. 欲知后事如何请看下回分解~