当前位置: 首页 > news >正文

【linux学习指南】Ext系列文件系统(四)路径分区链接

请添加图片描述

文章目录

  • 🌠⽬录与⽂件名
  • 🌠路径解析
  • 🌠路径缓存
  • 🌠挂载分区
    • 🌉 ⽂件系统总结
  • 🌠软硬连接
    • 🌉 硬链接
    • 🌉 软链接
    • 🌉 软硬连接对⽐
    • 🌉软硬连接的⽤途:
  • 🚩总结


🌠⽬录与⽂件名

问题:

  • 我们访问⽂件,都是⽤的⽂件名,没⽤过inode号啊?
  • ⽬录是⽂件吗?如何理解?

答案:

  • ⽬录也是⽂件,但是磁盘上没有⽬录的概念,只有⽂件属性+⽂件内容的概念。
  • ⽬录的属性不⽤多说,内容保存的是:⽂件名和Inode号的映射关系

readdir.c文件

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <dirent.h>
#include <sys/types.h>
#include <unistd.h>
int main(int argc, char *argv[])
{if (argc != 2){fprintf(stderr, "Usage: %s <directory>\n", argv[0]);exit(EXIT_FAILURE);}DIR *dir = opendir(argv[1]); //系统调⽤,⾃⾏查阅if (!dir){perror("opendir");exit(EXIT_FAILURE);}struct dirent *entry;while ((entry = readdir(dir)) != NULL){ //系统调⽤,⾃⾏查阅// Skip the "." and ".." directory entriesif (strcmp(entry->d_name, ".") == 0 || strcmp(entry->d_name, "..") == 0){continue;}printf("Filename: %s, Inode: %lu\n", entry->d_name, (unsigned long)entry->d_ino);}closedir(dir);return 0;
}

在这里插入图片描述
在这里插入图片描述

  • 所以,访问文件,必须打开当前目录,根据文件名,获得对应的inode号,然后进行文件访问
  • 所以,访问文件必须要知道当前工作目录,本质是必须能打开当前工作目录文件,查看目录文件的内容!

在这里插入图片描述
比如:要访问test.c,就必须打开test(当前工作目录) ,然后才能获取test.c对应的inode进而对文件进行访问。

🌠路径解析

问题:打开当前⼯作⽬录⽂件,查看当前⼯作⽬录⽂件的内容?当前⼯作⽬录不也是⽂件吗?我们访问
当前⼯作⽬录不也是只知道当前⼯作⽬录的⽂件名吗?要访问它,不也得知道当前⼯作⽬录的inode
吗?

  • 答案1:所以也要打开:当前⼯作⽬录的上级⽬录,额…,上级⽬录不也是⽬录吗??不还是上⾯的问题吗?
  • 答案2:所以类似"递归",需要把路径中所有的⽬录全部解析,出⼝是"/"根⽬录。
  • 最终答案3:⽽实际上,任何⽂件,都有路径,访问⽬标⽂件,⽐如:
 /home/whb/code/test/test/test.c

都要从根⽬录开始,依次打开每⼀个⽬录,根据⽬录名,依次访问每个⽬录下指定的⽬录,直到访问
test.c。这个过程叫做Linux路径解析。

注意:

  1. 所以,我们知道了:访问⽂件必须要有⽬录+⽂件名=路径的原因
  2. 根⽬录固定⽂件名,inode号,⽆需查找,系统开机之后就必须知道

可是路径谁提供?

  • 你访问⽂件,都是指令/⼯具访问,本质是进程访问,进程有CWD!进程提供路径。
  • 你open⽂件,提供了路径

可是最开始的路径从哪⾥来?

  • 所以Linux为什么要有根目录,根目录下为什么要有那么多缺省目录?
  • 你为什么要有家目录,你自己可以新建目录?
  • 上面所有行为:本质就是在磁盘文件系统中,新建目录文件。而你新建的任何文件,都在你或者系统指定的目录下新建,这不就是天然就有路径了嘛!
  • 系统+用户共同构建Linux路径结构.

🌠路径缓存

问题1:Linux磁盘中,存在真正的⽬录吗?
答案:不存在,只有⽂件。只保存⽂件属性+⽂件内容

问题2:访问任何⽂件,都要从/⽬录开始进⾏路径解析?
答案:原则上是,但是这样太慢,所以Linux会缓存历史路径结构

问题3:Linux⽬录的概念,怎么产⽣的?
答案:打开的⽂件是⽬录的话,由OS⾃⼰在内存中进⾏路径维护

Linux中,在内核中维护树状路径结构的内核结构体叫做:struct dentry

struct dentry
{atomic_t d_count;     /* protected by d_lock */unsigned int d_flags; /* per dentry lock */spinlock_t d_lock;    /* Where the name belongs to - NULL is * negative *//** The next three fields are touched by __d_lookup.  Place them here* so they all fit in a cache line.*/struct hlist_node d_hash; /* lookup hash list */struct dentry *d_parent;  /*parent directory */struct qstr d_name;struct list_head d_lru; /* LRU list *//** d_child and d_rcu can share memory*/union{struct list_head d_child; /* child of parent list */struct rcu_head d_rcu;} d_u;struct list_head d_subdirs; /* our children */struct list_head d_alias; /* inode alias list */unsigned long d_time; /* used by d_revalidate */struct dentry_operations *d_op;struct super_block *d_sb; /* The root of the dentry tree */void *d_fsdata; /* fs-specific data */
#ifdef CONFIG_PROFILINGstruct dcookie_struct *d_cookie; /* cookie, if any */
#endifint d_mounted;unsigned char d_iname[DNAME_INLINE_LEN_MIN];  /* small names */
};

注意:

  • 每个文件其实都要有对应的dentry结构,包括普通文件。这样所有被打开的文件,就可以在内存中形成整个树形结构
  • 整个树形节点也同时会隶属于LRU(Least Recently Used,最近最少使用)结构中,进行节点淘汰
  • 整个树形节点也同时会隶属于Hash,方便快速查找
  • 更重要的是,这个树形结构,整体构成了Linux的路径缓存结构,打开访问任何文件,都在先在这棵树下根据路径进行查找,找到就返回属性inode和内容,没找到就从磁盘加载路径,添加dentry结构,缓存新路径

在这里插入图片描述

🌠挂载分区

我们已经能够根据inode号在指定分区找⽂件了,也已经能根据⽬录⽂件内容,找指定的inode了,在
指定的分区内,我们可以为所欲为了。可是:
问题:inode不是不能跨分区吗?Linux不是可以有多个分区吗?我怎么知道我在哪⼀个分区???

详细挂载分区可查看【linux学习指南】磁盘分区挂载到目录,形成文件系统挂载点

🌉 ⽂件系统总结

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

🌠软硬连接

🌉 硬链接

我们看到,真正找到磁盘上⽂件的并不是⽂件名,⽽是inode。其实在linux中可以让多个⽂件名对应
于同⼀个inode。

[root@localhost linux]# touch abc[root@localhost linux]# ln abc def[root@localhost linux]# ls -li abc def263466 abc263466 def
  • abc和def的链接状态完全相同,他们被称为指向⽂件的硬链接。内核记录了这个连接数,inode 263466 的硬连接数为2。
  • 我们在删除⽂件时⼲了两件事情:1.在⽬录中将对应的记录删除,2.将硬连接数-1,如果为0,则将对应的磁盘释放。

🌉 软链接

硬链接是通过inode引⽤另外⼀个⽂件,软链接是通过名字引⽤另外⼀个⽂件,但实际上,新的⽂件被引⽤的⽂件的inode不同,应⽤常⻅上可以想象成⼀个快捷⽅式。在shell中的做法

[root@localhost linux]# ln -s abc.s abc[root@localhost linux]# ls -li263563 -rw-r--r--. 2 root root 0 915 17:45 abc261678 lrwxrwxrwx. 1 root root 3 915 17:53 abc.s -> abc263563 -rw-r--r--. 2 root root 0 915 17:45 def

在这里插入图片描述
acm
下⾯解释⼀下⽂件的三个时间:

  • Access最后访问时间
  • Modify⽂件内容最后修改时间
  • Change属性最后修改时间

🌉 软硬连接对⽐

  • 软连接是独⽴⽂件
  • 硬链接只是⽂件名和⽬标⽂件inode的映射关系

🌉软硬连接的⽤途:

  • 硬链接 .和… 就是硬链接
  • ⽂件备份

软连接

  • 类似快捷⽅式

🚩总结

请添加图片描述

相关文章:

【linux学习指南】Ext系列文件系统(四)路径分区链接

文章目录 &#x1f320;⽬录与⽂件名&#x1f320;路径解析&#x1f320;路径缓存&#x1f320;挂载分区&#x1f309; ⽂件系统总结 &#x1f320;软硬连接&#x1f309; 硬链接&#x1f309; 软链接&#x1f309; 软硬连接对⽐&#x1f309;软硬连接的⽤途&#xff1a; &…...

深度学习中的参数初始化

深度学习中的参数初始化主要是指初始化神经网络中的权重和偏置。权重和偏置通常分开初始化&#xff0c;偏置通常初始化为零或较小的常数值。 没有一种万能的初始化技术&#xff0c;因为最佳初始化可能因具体架构和要解决的问题而异。因此&#xff0c;尝试不同的初始化技术以了解…...

wpf 基于Behavior库 的行为模块

Microsoft.Xaml.Behaviors 是一个用于WPF&#xff08;Windows Presentation Foundation&#xff09;的行为库&#xff0c;它的主要作用是允许开发者在不修改控件源代码的情况下&#xff0c;为控件添加自定义的行为和交互逻辑。行为库的核心思想是通过定义可重用的行为组件&…...

【每日学点鸿蒙知识】导入cardEmulation、自定义装饰器、CallState状态码顺序、kv配置、签名文件配置

1、HarmonyOS 无法导入cardEmulation&#xff1f; 在工程entry mudule里的index.ets文件里导入cardEmulation失败 可以按照下面方式添加SystemCapability&#xff1b;在src/main/syscap.json(此文件需要手动创建&#xff09;中添加如下内容 {"devices": {"gen…...

【SpringMVC】REST 风格

REST&#xff08;Representational State Transfer&#xff0c;表现形式状态转换&#xff09;是一种访问网络资源的格式。传统的资源描述方式通常如下&#xff1a; http://localhost/user/getById?id1http://localhost/user/saveUser 而 REST 风格的描述则更简洁&#xff1a…...

IDEA修改编译版本

目录 一、序言 二、修改maven配置 1.修改 2.代码 三、pom文件配置 1.修改 2.代码 3.问题 一、序言 有两种方法可以帮助大家解决IDEA每次刷新maven的pom配置时&#xff0c;会发生发行源版本不正常的报错。个人推荐第二种&#xff0c;原因&#xff1a;第二种你刷新maven后…...

SkyWalking Agent 配置 Spring Cloud Gateway 插件解决日志错误

SkyWalking Agent 配置 Spring Cloud Gateway 插件解决日志错误 IDEA中启动网管时&#xff0c;需要配置VM启动参数&#xff0c;格式如下&#xff1a; # 配置 SkyWalking Agent 启动参数&#xff0c;以便将网关服务的性能数据上报到 SkyWalking 服务器。 -javaagent:/path/to/sk…...

canvas+fabric实现时间刻度尺(一)

前言 需求&#xff1a;显示一个时间刻度尺&#xff0c;鼠标移动会显示当前时间 技术&#xff1a;我们采用canvasfabric进行实现 效果 实现 1.创建canvas&#xff08;设置宽高&#xff09;设为全局变量 2.引入fabric包 3.画时间刻度尺&#xff08;长方形横线&#xff09; …...

傲雷亮相2024中国时尚体育季(珠海站),展现户外移动照明风采

2024年12月28-29日&#xff0c;2024中国时尚体育季&#xff08;珠海站&#xff09;国家级轮滑比赛在珠海金山体育公园成功举办。作为户外创新型移动照明领域的领导品牌&#xff0c;傲雷受邀参加了本次珠海金湾运动生活嘉年华的展览单元&#xff0c;与众多户外运动品牌同台展示。…...

YOLOv10-1.1部分代码阅读笔记-block.py

block.py ultralytics\nn\modules\block.py 目录 block.py 1.所需的库和模块 2.class DFL(nn.Module): 3.class Proto(nn.Module): 4.class HGStem(nn.Module): 5.class HGBlock(nn.Module): 6.class SPP(nn.Module): 7.class SPPF(nn.Module): 8.class C1(nn…...

@RestControllerAdvice注解

RestControllerAdvice 是 Spring 4 引入的一个组合注解&#xff0c;它结合了 ControllerAdvice 和 ResponseBody&#xff0c;专门用于处理 RestController 类型的控制器中的全局异常、全局数据绑定和全局模型属性等问题。在 Spring Boot 中&#xff0c;RestControllerAdvice 通…...

Enum枚举类与静态变量和静态数组的区别

Enum枚举类与静态变量和静态数组的区别 组成结构Enum枚举类静态变量静态数组 组成结构的区别相同之处不同之处 用法使用相同之处不同之处 组成结构 先来看下Enum枚举类&#xff0c;静态变量&#xff0c;静态数组的初始化过程&#xff0c;以下面为例子&#xff1a; public enu…...

uniapp——微信小程序读取bin文件,解析文件的数据内容(三)

微信小程序读取bin文件内容 读取用户选择bin文件&#xff0c;并解析数据内容&#xff0c;分包发送给蓝牙设备&#xff1b; 文章目录 微信小程序读取bin文件内容读取文件读取内容返回格式 API文档&#xff1a; getFileSystemManager 关于App端读取bin文件&#xff0c;请查看&…...

SpringBoot集成ECDH密钥交换

简介 对称加解密算法都需要一把秘钥&#xff0c;但是很多情况下&#xff0c;互联网环境不适合传输这把对称密码&#xff0c;有密钥泄露的风险&#xff0c;为了解决这个问题ECDH密钥交换应运而生 EC&#xff1a;Elliptic Curve——椭圆曲线&#xff0c;生成密钥的方法 DH&…...

python文件操作相关(excel)

python文件操作相关&#xff08;excel&#xff09; 1. openpyxl 库openpyxl其他用法创建与删除操作单元格追加数据格式化单元格合并单元格插入图片公式打印设置保护工作表其他功能 2. pandas 库3. xlrd 和 xlwt 库4. xlsxwriter 库5. pyxlsb 库应用场景参考资料 在 Python 中&a…...

探索React与Microi吾码的完美结合:快速搭建项目,低代码便捷开发教程

一、摘要 在当今的数字化时代&#xff0c;软件开发就像是一场探险&#xff0c;每个开发者都是探险家&#xff0c;探索着代码的奥秘。React作为前端开发的领军框架&#xff0c;其组件化和高效的渲染机制为开发者提供了强大的工具。而Microi吾码低代码平台的出现&#xff0c;则为…...

【面试系列】深入浅出 Spring Boot

熟悉SpringBoot&#xff0c;对常用注解、自动装配原理、Jar启动流程、自定义Starter有一定的理解&#xff1b; 面试题 Spring Boot 的核心注解是哪个&#xff1f;它主要由哪几个注解组成的&#xff1f;Spring Boot的自动配置原理是什么&#xff1f;你如何理解 Spring Boot 配置…...

@colyseus/social 模块详解

@colyseus/social 模块介绍 @colyseus/social 是一个适用于 Colyseus 游戏框架的扩展模块,提供了社交功能的支持,帮助开发者在多人游戏中快速实现玩家之间的社交互动。它主要提供了玩家账户管理、好友系统、好友请求、组队和聊天功能等,旨在简化游戏中社交功能的实现。 核心…...

石岩路边理发好去处

周末带娃去罗租公园玩&#xff0c;罗租公园旁边就是百佳华和如意豪庭小区&#xff0c;发现如意豪庭小区对面挺多路边理发摊点 理发摊点聚焦在这里的原因是刚好前面城管来了暂时避避&#xff0c;例如还有一个阿姨剪到一半就跟着过来。这里的城管只是拍了一处没有摊位的地方&…...

ROS 2中的DDS中间件

文章目录 一、简介二、默认支持的 DDS (Data Distribution Service) 实现三、切换DDS实现小结 一、简介 中间件是一个软件层&#xff0c;通常用于连接不同的应用程序、服务或系统&#xff0c;以便它们能够相互通信和交换数据。中间件并不直接向用户暴露&#xff0c;而是在系统…...

C++_核心编程_多态案例二-制作饮品

#include <iostream> #include <string> using namespace std;/*制作饮品的大致流程为&#xff1a;煮水 - 冲泡 - 倒入杯中 - 加入辅料 利用多态技术实现本案例&#xff0c;提供抽象制作饮品基类&#xff0c;提供子类制作咖啡和茶叶*//*基类*/ class AbstractDr…...

java_网络服务相关_gateway_nacos_feign区别联系

1. spring-cloud-starter-gateway 作用&#xff1a;作为微服务架构的网关&#xff0c;统一入口&#xff0c;处理所有外部请求。 核心能力&#xff1a; 路由转发&#xff08;基于路径、服务名等&#xff09;过滤器&#xff08;鉴权、限流、日志、Header 处理&#xff09;支持负…...

2024年赣州旅游投资集团社会招聘笔试真

2024年赣州旅游投资集团社会招聘笔试真 题 ( 满 分 1 0 0 分 时 间 1 2 0 分 钟 ) 一、单选题(每题只有一个正确答案,答错、不答或多答均不得分) 1.纪要的特点不包括()。 A.概括重点 B.指导传达 C. 客观纪实 D.有言必录 【答案】: D 2.1864年,()预言了电磁波的存在,并指出…...

ESP32读取DHT11温湿度数据

芯片&#xff1a;ESP32 环境&#xff1a;Arduino 一、安装DHT11传感器库 红框的库&#xff0c;别安装错了 二、代码 注意&#xff0c;DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...

相机从app启动流程

一、流程框架图 二、具体流程分析 1、得到cameralist和对应的静态信息 目录如下: 重点代码分析: 启动相机前,先要通过getCameraIdList获取camera的个数以及id,然后可以通过getCameraCharacteristics获取对应id camera的capabilities(静态信息)进行一些openCamera前的…...

NFT模式:数字资产确权与链游经济系统构建

NFT模式&#xff1a;数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新&#xff1a;构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议&#xff1a;基于LayerZero协议实现以太坊、Solana等公链资产互通&#xff0c;通过零知…...

AI书签管理工具开发全记录(十九):嵌入资源处理

1.前言 &#x1f4dd; 在上一篇文章中&#xff0c;我们完成了书签的导入导出功能。本篇文章我们研究如何处理嵌入资源&#xff0c;方便后续将资源打包到一个可执行文件中。 2.embed介绍 &#x1f3af; Go 1.16 引入了革命性的 embed 包&#xff0c;彻底改变了静态资源管理的…...

DeepSeek 技术赋能无人农场协同作业:用 AI 重构农田管理 “神经网”

目录 一、引言二、DeepSeek 技术大揭秘2.1 核心架构解析2.2 关键技术剖析 三、智能农业无人农场协同作业现状3.1 发展现状概述3.2 协同作业模式介绍 四、DeepSeek 的 “农场奇妙游”4.1 数据处理与分析4.2 作物生长监测与预测4.3 病虫害防治4.4 农机协同作业调度 五、实际案例大…...

微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据

微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据 Power Query 具有大量专门帮助您清理和准备数据以供分析的功能。 您将了解如何简化复杂模型、更改数据类型、重命名对象和透视数据。 您还将了解如何分析列&#xff0c;以便知晓哪些列包含有价值的数据&#xff0c;…...

推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材)

推荐 github 项目:GeminiImageApp(图片生成方向&#xff0c;可以做一定的素材) 这个项目能干嘛? 使用 gemini 2.0 的 api 和 google 其他的 api 来做衍生处理 简化和优化了文生图和图生图的行为(我的最主要) 并且有一些目标检测和切割(我用不到) 视频和 imagefx 因为没 a…...