Linux——innode

news2024/11/14 2:30:49

目录

回顾缓冲区 

标准错误流的理解 

文件系统

Inode VS 文件名

创建/删除/查看文件系统做了什么 

软硬链接

动静态库 

习题 


 

回顾缓冲区 

 

 关掉1,log.txt中没文件是因为,字符串在缓冲区当中,缓冲区还没刷新,我们把fd给关了,数据就无法刷新

 刷新缓冲区

 

标准错误流的理解 

 

 

 重定向到log.txt,>重定向改变的是1号文件描述符

 

 说明了1和2号文件描述符对应的都是显示器文件,但是他们俩个是不同的,重定向一般是重定向1号文件描述符

上面我们可以看到,二号文件描述符里的内容都打印到屏幕上。

如果程序运行可能有问题的话,建议使用stderr或者cerr打印,常规文本stdout或cout打印即可

如果想经过重定向符号打印到一个文件里

 ./myfile > log.txt 2>&1

含义:1重定向到log.txt,把1号文件描述符里的内容拷给2,也就是说1和2里面是同一个文件

 

 先执行输入重定向,把log.txt内容给cat,然后cat输出重定向给 back.txt

perror向2号文件描述符写入,perror会根据错误码输出错误原因。

未加errno之前perror 2:Success

 把errno改为3

 改为2

 

 自己实现perror

 删掉log.txt,再运行程序

文件系统

 

 磁盘的抽象结构

SuperBlock:文件系统的属性信息(整个分区属性的属性集)。

虽然磁盘的基本单位是扇区(512字节),但是操作系统(文件系统)和磁盘进行IO的基本单位是4KB(8*512字节)

不以512字节为IO基本单位:1.512字节太小了,就需要多次IO(多次访问磁盘),导致效率降低。

     2.如果操作系统使用和磁盘一样的大小,万一磁盘基本大小变了,OS的源代码肯定要改,用4KB可以将操作系统的硬件和软件进行解耦合。4kb一般为块大小,磁盘称为块设备。

Date Block:多个4KB(扇区*8)的集合,保存的都是特定文件的内容

文件=内容+属性

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

BlockBItmap:假设有10000+个blocks,BlockBitmap里面就有10000+个比特位,比特位和特定的block是一 一对应的,比特位位1,代表该block被占用,否则表示可用。

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

GDT:块组描述符,这个块组多大,已经使用多少了,有多少Inode,已经占用多少个,还剩多少,已经使用多少block,还剩多少……

这些信息可让一个文件的信息可追溯,可管理。

我们将块组分割称为上面的内容。并且写入相关的数据,每一个块组都这么干,整个分区就被写入了文件系统信息。这个过程就叫格式化

一个文件“只”对应一个inode属性节点,inode编号。

一个文件可以有多个data block

哪些block属于同一个文件?找到文件,只要找到该文件对应的inode编号,就能找到该文件的inode属性,可是文件的内容呢?

Inode属性里面有一个数组,数组里面的内容就是我们用到了哪些Data block。我们可以通过数组找到,数组和磁盘块建立了映射关系

因此,只要找到Inode编号,就能找到Inode,找到Inode就能找到对应的数据块,此时属性+内容全部找到,就能对文件进行读取

data block中,不是所有的data block,只能存文件数据,也可以存其它块的块号,当文件内容较大时,会有一个或多个块信息,这些信息指向其它的数据块,而我们通过找到其它的数据块就能找到文件内容,这就是对于较大文件的存储方式

Inode VS 文件名

要找到文件就要先找Inode编号, 在特定的分区当中Inode在分区内有效,

Inode编号->分区特定的bg(block group)->inode->属性->内容

df -h查看自己在哪个分区

 用户如何知道Inode编号?

依托于目录结构,目录当中保存了对应的某个文件

Linux中,Inode属性中,没有文件名的说法(Inode属性不保存文件名)。

预备知识:1.一个目录下,可以保存很多文件,但这些文件名不重复,

                  2.LInux下一切皆文件,目录也是文件,目录也有自己的Inode,有自己的data block,目录的data block中存的是文件名和对应的Inode编号的映射关系。

Inode和文件名互为Key值。

创建文件的时候把文件的Inode编号和文件名写入到目录的Data block中,建立映射关系。因此对目录具有写权限,才可以创建文件。

当用ls显示文件名的时候,为什么要在目录里面有r权限?

因为要去目录的内容里拿文件名,如果要拿到文件属性,先取去目录里拿到文件名,再通过映射关系找到Inode,之后去分区中找到文件的各种属性。

创建/删除/查看文件系统做了什么 

 创建文件:用户提供文件名,文件系统创建好文件并且返回Inode,给这俩者建立映射关系写到目录内容当中,其实就是找到目录的编号Inode(这个Inode是目录的Inode),之后找到它的数据块,把内容写入即可。

删除文件:用户提供文件名,文件系统会根据文件名找到Inode,根据Inode找到对应的块组,把InodeBitmap由1置为0,BlockBitmap也由1置0,再从目录中去掉这种映射关系,此时就代表删掉了。删除后的文件能恢复前提:能找到该文件的Inode(该Inode编号,没有被使用,Inode和datablock未被占用)

查看文件:找到文件名通过映射找到Inode,把内容显示出来即可。

格式化就是在磁盘写入文件系统。

Inode是固定的,datablock是固定的。

有时候创建文件失败的原因是因为Inode还有,但没有databolck或没有databolck但是又有Inode

软硬链接

ls -i会显示Inode

创建一个软链接 ln -s 

 这里soft.link 是指向testLink.txt的软链接

 这是在创建一个硬链接

 

 软链接有自己独立的Inode

 建立完硬链接后,这里变为2,之前是1,而且这里硬链接的Inode是661496和test1Link.txt的Inode一样

 结论:软链接有独立的Inode->软链接是一个独立的文件,硬链接没有独立的Inode->硬链接不是一个独立的文件

软链接就如同windows下的快捷方式,不需要输入具体路径,可直接运行

软链接特性:软链接的文件内容,是指向的文件对应的路径。

硬链接:创建硬链接,就是在指定的目录下建立了文件名和指定Inode的映射关系。就是起别名。

删除test1Link.txt之后并不影响hard.txt的存在,这里由2变为1,而且我们发现Inode此时还在。

这是因为刚才在删的时候,把test1Link.txt的Inode和文件名的映射关系在目录里去掉了,但Inode还在,而这里由2变1的数字被称作硬链接数

 引用计数是用来记录多少个文件和Inode进行关联的

 删除软硬链接用unlink

 把文件全删光,再创建一个新的文件,创建的新文件默认的引用计数是1,自己的文件名和Inode形成了映射

空目录的默认引用计数是2,目录首先和Inode建立映射关系,进入目录后可以看到.和..

.和..也是文件名,.和dir对应的Inode一样

 

 此时在dir里面创建一个目录,引用计数又成为了3

 我们发现fl里面的..对应的Inode和dir对应的Inode一样,这是因为fl的..指向上一级路径,也就是dir

 

动静态库 

先创建四个文件,在.h中声明,在.c中实现,写一些简单的程序

myprint.c

 mymath.c

 注意:要写库,库里面不能有main函数

我们使用time函数,获得时间戳

 生成.o文件

 

 如果把.o和.h给别人,别人是能使用的

这里有俩个.o文件,我们可以把这俩个.o文件打包,打包的过程就叫形成静态库

打包命令ar -rc lib+库名.a

ar归档的意思

r替换,c创建,这里要创建库名字,库名字前缀必须是lib,后缀必须是.a

打包后生成.a文件

静态库制作:源文件变成.o,打包后变为.a文件

 创建一个makefile文件

 库通常是有头文件和对应的库文件,因此我们创建一个目录(目录名就叫hello),该目录下有俩个文件,一个存放库的头文件,另一个存放对应的库文件

 

 红框部分叫发布

 include里面存的是对应的库头文件,lib是库文件

 此时库已经被打包好了,我们要给别人使用

我们把它拷贝到上级目录的一个文件夹下

进入该目录后,可看到我们打包的库

 

 创建一个main.c的文件,这是main.c的文件内容

 把库拷贝到系统路径下,头文件gcc的默认搜索路径是:/usr/include

库文件的默认搜索路径是:/lib64或usr/lib64

先把hello/include路径下的所有文件,拷贝到/usr/include路径下

 此时hello/include路径下的文件就被拷贝到了系统里

 库文件也拷贝过去

 但此时输入gcc main.c系统仍然报错

 这是因为我们自己所写的库,属于第三方库(不是语言库也不是系统库),C语言的静态库默认为lib64/libc.a,这里报错是因为没有告诉gcc我们要链接哪个库

输入gcc main.c -lhello ,注意这里要加l去掉库前缀和后缀,即l后直接加库名字

 

 输入./a.out即可运行程序,这就是静态库的使用

把所需要的库拷贝到默认路径下,就叫做库的安装,我们一般不要把自己的库安装到系统路径下。

 把库删掉之后,使用时就会报错,这里报错信息为这个头文件找不到

 编译器默认在系统路径和当前路径下找头文件,-I 在指定路径下找头文件,加上-I之后还是会报错,但是跟刚才的报错有点差别,这是因为此时找到了头文件,但是找不到对应的库,我们的库没有在系统默认路径下安装,我们得告诉编译器去哪里找库

 -L去指定路径下搜索库文件

 我们已经声明去哪里找头文件和库了,但此时还会报错,这是因为我们无法保证lib路径下只有一个库,我们没有告诉编译器是lib路劲下得哪一个库,用-l(小写L)

加-lhello 去掉库的前缀和后缀

 总结:-I 头文件搜索路径

            -L 库文件搜索路径

            -l在特定路径下,使用某个具体的库

习题 

下面关于Linux文件系统的inode描述错误的是:A

A.inode和文件名是一一对应的

B.inode描述了文件大小和指向数据块的指针

C.通过inode可获得文件占用的块数

D.通过inode可实现文件的逻辑结构和物理结构的转换

A选项错误,这里说的文件名指的是文件的目录项,一个文件inode是有可能有多个目录项的,比如给一个文件创建多个硬链接,因此并非一一对应

B选项正确,inode中包含了文件的各种描述信息,权限,大小,时间属性,数据块指针....等等都包含在内

C选项正确,inode中包含了文件数据所占据的存储位置的信息,因此可以获得we你按占用的数据块数

D选项正确,inode就像是文件的一个整体的描述,有了这个描述,上层就可以重新组织虚拟逻辑结构,通过inode映射其物理结构(简单理解可以联想类似于虚拟地址空间与物理内存之间的页表)

查看文件file的inode号,正确的是:C

A.ls -l file

B.ls -a file

C.ls -i file

D.ls -d file

ls常见选项:

  • -l 表示查看文件详细信息
  • -a 表示查看所有包含以 . 开头的文件(隐藏文件)
  • -i 打印每个文件的inode索引号
  • -d 针对目录产生效果,表示查看目录文件自身信息,而并非目录内的文件信息

使用In命令将生成了一个指向文件old的符号链接new,如果你将文件old删除,是否还能够访问文件中的数据? A

A.不可能再访问

B.仍然可以访问

C.能否访问取决于文件的所有者

D.能否访问取决于文件的权限

ln生成符号链接文件,指的是通过 ln -s 命令生成软链接文件,

软链接文件是一个独立的文件,有自己的inode节点,这个文件数据中保存的是源文件路径,通过保存的路径访问源文件,因此源文件被删除则无法再访问,通过路径将找不到源文件,这时候软链接就会失效。

根据以上对于软链接的理解,A选项正确,其他选项都错误

 Linux中包括两种链接:硬链接(Hard Link)和软连接(Soft Link),下列说法正确的是(A)

A.软连接可以跨文件系统进行连接,硬链接不可以

B.当删除原文件的时候软连接文件仍然存在,且指向的内容不变

C.硬链接被删除,磁盘上的数据文件会同时被删除

D.硬链接会重新建立一个inode,软链接不会

软链接文件是一个独立的文件有自己的inode节点,文件中保存了源文件路径,通过数据中保存的源文件路径访问源文件

硬链接是文件的一个目录项,与源文件共用同一个inode节点,直接通过自己的inode节点访问源文件(其实本质上来说与源文件没区别)

  •   A正确 不同分区有可能有不同文件系统,就算系统相同,也会导致节点号有歧义冲突,因此硬链接不能跨分区建立,正确
  •   B错误 删除源文件,软链接文件失效
  •   C错误 硬链接被删除,则inode中的链接数-1,并不会直接删除文件数据,而是等链接数为0的时候才会实际删除对应文件的inode,将所占用数据块置为空闲
  •   D错误 硬链接与源文件共用inode

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

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

相关文章

堆的实现及应用

下面用C语言介绍堆的实现以及应用 文章目录1. 堆的简介2. 堆的实现HeapInitHeapDestroyHeapPushHeapPop3. 堆的应用堆排序TopK问题1. 堆的简介 堆是一颗完全二叉树。这里所说的堆是一种非连续的数据结构,与操作系统内存分布的堆是两回事,它们没有任何联…

金融帝国实验室(Capitalism Lab)官方中文汉化包下载(v4.03)

<FCT汉化小组>Vol.001号作品 ————————————— ◎作品名称&#xff1a;金融帝国实验室&#xff08;CapLab&#xff09;官方汉化包 ◎汉化作者&#xff1a;FCT汉化小组&#xff08;Enlight Software认证&#xff09; ◎发布版本&#xff1a;CapLab Simplifi…

POJ 1845 Sumdiv题解(C++ 整数惟一分解定理+分治法求等比数列之和+快速幂)

文章目录整数惟一分解定理分治法求等比数列和完整代码传送门&#xff1a; POJ 1845 SumDiv 整数惟一分解定理 任何一个大于1的整数n都可以分解成若干个质因数&#xff08;素因数&#xff09;的连乘积&#xff0c;如果不计各个素因数的顺序&#xff0c;那么这种分解是唯一的&a…

王者荣耀入门技能树

前言 最近在学习技能树&#xff0c;我也试着写一写技能树&#xff0c;放松一下。 这里附上一张可爱的兔兔应景。仔细看&#xff0c;后边题目会提到&#xff0c;哈哈。 职业 以下哪个不属于王者荣耀中的职业&#xff1a; 射手法师辅助亚瑟 技能 以下哪个技能可以加快打野…

春节假期后,如何快速让员工恢复上班的元气和状态?

每当假期过后&#xff0c;总有一些员工无法快速恢复工作状态&#xff0c;团队的氛围也很难一下子热起来。而春节假期既是长假&#xff0c;又是过节氛围最浓厚的假期&#xff0c;节后返工的涣散问题自然更明显一些。但对于服装店铺来说&#xff0c;年后开工正处于旺季&#xff0…

【Vue】我的尚品汇项目笔记---20230109~20230120

014之前可参考官方笔记 https://blog.csdn.net/weixin_43424325/article/details/121684101 015-axios二次封装 api/index.js 设定 //当前模块&#xff0c;API进行统一管理&#xff0c;即对请求接口统一管理 import requests from "/api/request";//首页三级分类…

通达信插件获取并存储通达信商品指数的实时数据

一、引子 通达信商品指数一共有23个&#xff0c;如下图所示&#xff1a; 如果想获取历史数据&#xff0c;只需要通过通达信的数据下载和导出功能即可&#xff0c;现在我们需要获取这23个指数的实时数据&#xff0c;通过导出功能就没有办法了。 在最初的阶段&#xff0c;考虑的…

微服务自动化管理【IDEA使用Docker插件进行一键部署】

本章目标 IDEA使用Docker插件实现springboot项目的一键部署 要开两个虚拟机 server registry server上进行操作 Docker开启远程api端口(注意这种配置方式只适用于开发和学习&#xff0c;在公共网络中不要这样配置&#xff0c;容易引发安全问题) 默认情况下dokcer是不支持远程…

linux基本功系列之find命令实战

文章目录前言&#x1f680;&#x1f680;&#x1f680;一. find命令介绍二. find常用参数及语法格式三. 示范案例3.1 查找符合文件名规则的文件3.2 根据文件类型类查找文件3.3 按照更改时间或访问时间等查找文件3.4 查找并执行相应的命令3.5 按照文件大小来查找3.6 按照文件所有…

启动hive报错no hbase in

启动hive报错no hbase in 将hdfs和yarn都启动成功之后&#xff0c;启动hive&#xff0c;如下所示&#xff1a;[atguiguhadoop102 conf]$ cd /opt/module/hive/ [atguiguhadoop102 hive]$ bin/hive报错信息如下which: no hbase in (/usr/local/bin:/usr/bin:/usr/local/sbin:/us…

C++ · 类和对象 · 02 | 类的6个默认成员函数

啊我摔倒了..有没有人扶我起来学习.... &#x1f471;个人主页&#xff1a;《CGod的个人主页》\color{Darkorange}{《CGod的个人主页》}《CGod的个人主页》交个朋友叭~ &#x1f492;个人社区&#xff1a;《编程成神技术交流社区》\color{Darkorange}{《编程成神技术交流社区》…

【操作系统】—— 如何安装双系统与多系统(带你快速了解)

&#x1f4dc; “作者 久绊A” 专注记录自己所整理的Java、web、sql等&#xff0c;IT技术干货、学习经验、面试资料、刷题记录&#xff0c;以及遇到的问题和解决方案&#xff0c;记录自己成长的点滴。 &#x1f341; 操作系统【带你快速了解】对于电脑来说&#xff0c;如果说…

博客系统项目的自动化测试

作者&#xff1a;~小明学编程 文章专栏&#xff1a;测试开发 格言&#xff1a;热爱编程的&#xff0c;终将被编程所厚爱。 目录 博客界面 测试用例 界面测试 功能测试 性能测试 兼容性测试 易用性测试 安全性测试 ​编辑自动化测试 登录界面的测试 界面文字模块 测…

ubuntu使用教程与常用命令

ubuntu使用教程 一、 Ubuntu简介 Ubuntu&#xff08;乌班图&#xff09;是一个基于Debian的以桌面应用为主的Linux操作系统&#xff0c;据说其名称来自非洲南部祖鲁语或科萨语的“ubuntu”一词&#xff0c;意思是“人性”、“我的存在是因为大家的存在”&#xff0c;是非洲传…

Python爬虫之Scrapy框架系列(5)——项目实战【某瓣Top250电影所有信息的txt文本存储】

上篇文章已经成功解析提取到豆瓣Top250电影想要的所有数据。下一步就是将其交给管道进行存储。 目录&#xff1a;1. 编写items.py文件&#xff08;定义结构化数据字段&#xff09;2. 爬虫文件里将数据一一对应字段名&#xff1a;3. 将数据返回给管道&#xff1a;4. 编写pipelin…

MCAL系列介绍04-ICU

本文框架1. 前言2. 基本概念3. ICU采集过程3.1 获取周期占空比3.2 获取边沿数量3.3 获取时间戳4. Autosar系列文章快速链接1. 前言 ICU驱动器是使用Input Capture Uint模块&#xff08;ICU&#xff09;解调PWM信号、计数脉冲、测量频率和占空比、生成简单中断以及唤醒中断的模…

树莓派配置Python虚拟环境、安装PyQt5、安装PySide2

要从头设置好一台可用于开发的树莓派&#xff0c;可以参考树莓派 4B 无屏幕&#xff0c;连接WiFi、SSH、VNC&#xff0c;系统换源、pip换源&#xff0c;安装中文输入法 Python虚拟环境 树莓派&#xff08;或者说arm平台&#xff09;使用Python虚拟环境的正确方式是使用pipenv…

【手写 Vue2.x 源码】第三十九篇 - 组件部分 - 创建组件虚拟节点

一&#xff0c;前言 上篇&#xff0c;介绍了组件部分-组件的合并&#xff0c;主要涉及以下几个点&#xff1a; 组件初始化情况&#xff1b;组件合并的位置&#xff1b;组件合并的策略&#xff1b;组件合并后测试&#xff1b; 本篇&#xff0c;组件部分-组件的编译&#xff1…

【C语言】对<进阶版三子棋>的完善和改进

这篇文章主要是对前面三子棋游戏的完善和改进。 文章目录 目录 1.将棋子*和#&#xff0c;改为1和0&#xff1b; 2.电脑下棋显示坐标 3.可以选择电脑先手或玩家先手 4.在退出游戏时显示游戏信息 5.完善后的游戏效果 二、完整程序代码 1.game.h 2.test.c 3.game.c 总结 前言 h…

【教程】虚拟环境与Pytorch安装

【教程】虚拟环境与Pytorch安装NVIDIA驱动安装虚拟环境创建激活/删除相关库的安装Pytorch安装安装地址可能遇到的问题处理报错安装卡顿测试是否安装完成参考NVIDIA驱动安装 NVIDIA驱动可在官网进行安装&#xff1a;NVIDIA驱动官网 命令行输入nvidia-smi可查看cuda版本等信息&…