【linux】基础IO(三)

上一节基础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 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. 也为了方便对磁盘的管理

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

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

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

相关文章

JS变量声明var、let、const详解

JavaScript 中的变量是松散类型的,可以保存任何类型数据,变量只不过是一个名称。JavaScript 中,可以声明变量的关键字有var、let和const。 一、var 使用var定义变量,可以保存任何类型的值。若不初始化变量,变量会保存…

Redis基础操作与持久化

目录 引言 一、Reids工具与数据类型 (一)Reids工具 (二)Redis数据类型 1.String(字符串) 2.Hash(哈希) 3.List(列表) 4.Set(集合&#xff…

实践笔记-linux内核版本升级(centos7)

linux内核版本升级 1.查看当前内核版本信息2.采用yum方式进行版本升级2.1导入仓库源2.2选择 ML 或 LT 版本安装2.3设置内核启动 3.删除旧版本内核 1.查看当前内核版本信息 #查看操作系统版本 cat /etc/redhat-release #查看系统内核 uname -r2.采用yum方式进行版本升级 2.1导…

白色磨砂质感html5页源码

白色磨砂质感html5页源码,简约的基础上加上了团队成员,自动打字特效音乐播放器存活时间 源码下载 https://www.qqmu.com/2980.html

LCR测试仪的开路与短路

开路清零 上档 开路 进入开路清零菜单 执行以下步骤进行开路清零: 仪器处于测试状态下,按上档 键,屏幕左上角“SHIFT”点亮。按下开路 键 选择清零功能,LCD 显示信息如图所示通过【▲】或【▼】来选择执行“SPOT”或“SWEEP”…

即将上-UE独立程序高级开发-自动化系统

我们即将带来自动化高级开发内容 自动化服务器 自动化蓝图脚本编辑 自动化游戏测试 自动化镜像 自动化压缩美术流程 即将上架-UE独立程序高级开发-自动化系统_哔哩哔哩_bilibili

vscode的源码插件GitHub Repositories

打铁还需自身硬,需要不断提升自我,提升自我的一种方式就是看源码,站在更高的维度去理解底层原理,以便以后更好的开发和解决问题,由于源码一个动不动就是几个G甚至十几个G,如果一个个源码下载下来&#xff0…

数字图像处理项目——基于BCNN和迁移学习的鸟类图像细粒度分类(论文/代码)

完整的论文代码见文章末尾 以下为核心内容 摘要 本文采用了ResNet50、VGG19、InceptionV3和Xception等四种不同的深度神经网络模型,并应用于鸟类图像的细粒度分类问题中,以探究其在该任务上的性能表现。 其中,本文使用了BCNN(B…

查分约束学习

问题模型&#xff1a; 有n个变量&#xff1a;&#xff0c;有m个约束条件 令差分数组&#xff0c;可以知道如果x1x2<q&#xff0c;那么与j和i-1有关联 由画图可知&#xff0c;如果有在i-1至j建立的有向图中跑最短路&#xff0c;那么dis[n]即为最小的约束变量 另外&#x…

Chrome浏览器如何跟踪新开标签的网络请求?

在测试一个东西的时候&#xff0c;它虽然是a链接&#xff0c;但是&#xff0c;是由前端在js里写跳转的。我又必须要知道它的跳转链接&#xff0c;只能用截屏的方式来捕捉浏览器的地址栏链接 打开浏览器控制台(F12)点击红色箭头打钩为弹出式窗口自动打开DevTools 英文版调试参…

华大单片机新建工程步骤

1.新建文件夹&#xff0c;比如00_LED 2.拷贝 hc32f460_ddl_Rev2.2.0\driver 到 00_LED 3.拷贝 hc32f460_ddl_Rev2.2.0\mcu\common 到 00_LED 4.拷贝 hc32f460_ddl_Rev2.2.0\example\ev_hc32f460_lqfp100_v2\gpio\gpio_output\source 到 00_LED 5.拷贝 hc32f460_ddl_Rev2.2.…

【数据结构】线性表部分习题2(顺序表与链表)

数据结构&#xff08;线性表部分2&#xff09; 数据结构习题持续更新中&#xff01;&#xff01;&#xff01; 目录 一、单选题二、简答题1. 顺序表就地逆置2. 循环单项链表的就地逆置 作业习题笔记&#xff1a; 该部分是线性表部分习题的补充、更多习题见: 数据结构&#xf…

933.最近的请求次数

题目&#xff1a;写一个 RecentCounter 类来计算特定时间范围内最近的请求。 请你实现 RecentCounter 类&#xff1a; RecentCounter() 初始化计数器&#xff0c;请求数为 0 。int ping(int t) 在时间 t 添加一个新请求&#xff0c;其中 t 表示以毫秒为单位的某个时间&#x…

HarmonyOS 开发-使用SideBarContainer侧边栏淡入淡出动效实现案例

介绍 在2in1或平板上&#xff0c;群聊侧边栏是一种较为常用的功能&#xff0c;虽然HarmonyOS已经具备了基本的动效&#xff0c;但是部分情况下开发者可能有定制侧边栏动效的需求&#xff0c;本例主要介绍了如何基于显式动画实现侧边栏的淡入淡出动效。 效果图预览 使用说明&a…

​泛微文书定人事档案一体化管理,覆盖人事管理全过程,人事档案全量归档

人事档案是个人身份、学历、资历等方面的证据&#xff0c;与个人工资待遇、社会劳动保障、组织关系紧密挂钩&#xff0c;具有法律效力。应注重收集和鉴别、整理工作&#xff0c;提升人事档案利用率。 企业应依据国家有关人事档案管理规定&#xff0c;制定企业人事档案管理办法&…

mysql性能索引调优易混点总结

文章目录 一、 前言二、explain相关三、索引优化相关联合索引索引下推排序和分组相关优化分页优化表关联优化嵌套循环连接 Nested-Loop Join(NLJ) 算法in和exsits优化 一、 前言 近几年看了很多和mysql相关的书&#xff0c;文章或视频&#xff0c;但仍然有一些点&#xff0c;看…

【吊打面试官系列】Java高并发篇 - 什么是线程组,为什么在 Java 中不推荐使用?

大家好&#xff0c;我是锋哥。今天分享关于 【什么是线程组&#xff0c;为什么在 Java 中不推荐使用&#xff1f;】面试题&#xff0c;希望对大家有帮助&#xff1b; 什么是线程组&#xff0c;为什么在 Java 中不推荐使用&#xff1f; ThreadGroup 类&#xff0c;可以把线程归属…

# 计算机视觉入门

## 概述 计算机视觉&#xff08;Computer Vision&#xff09;是人工智能的重要分支领域&#xff0c;它关注于如何使计算机“看”懂图像或视频内容&#xff0c;并从中提取有用信息&#xff0c;对视觉数据进行处理和理解。随着深度学习技术的兴起&#xff0c;计算机视觉领域取得…

排序+去重+二分,LeetCode 2009. 使数组连续的最少操作数

目录 一、题目 1、题目描述 2、接口描述 python3 cpp 3、原题链接 二、解题报告 1、思路分析 2、复杂度 3、代码详解 python3 cpp 一、题目 1、题目描述 给你一个整数数组 nums 。每一次操作中&#xff0c;你可以将 nums 中 任意 一个元素替换成 任意 整数。 如果 …

领鸡蛋游戏养鸡游戏淘宝客源码广告联盟

用户中心 用户信息&#xff1a;显示用户名、头像、鸡蛋数量、足迹等基本信息。我的足迹&#xff1a;展示用户的饲料获取记录明细&#xff0c;包括来源、数量和时间。我的好友&#xff1a;展示邀请的好友列表&#xff0c;支持好友间互动&#xff0c;如串门、偷取/赠送饲料&#…