【linux】:老师问什么是爱情,我说了句:软硬链接和动静态库(上)

简介: 【linux】:老师问什么是爱情,我说了句:软硬链接和动静态库(上)

前言



上一篇文章的最后我们讲解了文件的inode,那么文件名和inode有什么区别呢?区别就在于linux系统只认inode号,文件的inode属性中,并不存在文件名,而文件名其实是给用户用的。我们以前讲过linux文件目录,那么目录是文件吗?答案是是的,目录也是文件,并且目录也有inode,任何一个文件一定在目录里面,所以目录的内容是什么呢?首先目录的内部需要数据块,目录的数据块里面保存的是文件名和inode编号对应的映射关系,而且在目录内,文件名和inode互为key值,当我们访问一个文件的时候,我们是在特定目录下进行访问的,要找到inode需要先在当前目录下,找到文件对应的inode编号,一个目录也是一个文件,也一定属于一个分区,结合inode,在该分区中找到分组,在该分组的inode table中,找到文件的inode,通过inode和对应的datablock的映射关系,找到改文件的数据块,并加载到操作系统,并完成显示到显示器,下面我们进入本篇文章的主体


一、软硬链接



理解文件的增删查改


根据文件名找到inode -》number,从inode number到inode属性中的映射关系,设置block bitmap对应的比特位,然后将这个比特位置0即可。所以删除文件,只需要修改位图即可。

下面我们看一下inode和datablock的映射关系:

0ebefb9c1db14a1a8807de0dc5452ae1.png


上图中我们只画出了直接索引,但其实并不仅仅是这样,因为直接索引能存放的数据太少了,而二级索引能存储的数据更多,二级索引所指向的数据块里面的内容,不是直接的数据,而是其他数据块的编号,二级索引上面还有三级索引,这些我们就不再介绍了 我们直接进入软硬链接的讲解:

我们先演示如何做一个软连接或硬链接:

7b3b5df20f474803adf0508a98b05c41.png

建立软连接的命令是ln -s 文件名 软连接文件名

文件属性前面的l代表link,表示链接,下面我们看一下这个链接有什么:

49e28f6179f441f18f32a00f97b52e60.png

我们发现这个链接指向刚刚那个原始文件,下面我们看看这个文件的inode:

65680a1e22aa497fadae2a500ec590c1.png

软连接是一个独立的链接文件,有自己的inode number,必有自己的inode属性和内容。下面我们再演示一下硬链接:

e98b0cae80d5427eab7be4e7c7507dd9.png

硬链接就是刚刚的命令少掉-s选项即可,ln 文件名 硬链接文件名。

下面我们看看硬链接的文件和原始文件有什么关系:

ab975b3cce2d47979cec9fba49af760f.png


我们发现硬链接和原始文件的inode一模一样,硬链接和目标文件共用一个inode number,意味着硬链接一定是和目标文件使用同一个inode的。


并且文件属性后面的数字都变成2了,这是什么意思呢?我们先讲原始文件删除看看有什么不一样的地方:

336933e139b5436ea2e9d51b417cf1cf.png


我们发现原来的2又变成1了但是inode依旧存在,我们看看可以读取吗

971bd9a9141f41f19999f8450434fe87.png


我们发现将原始文件删除后硬链接照样可以打印出原始文件的数据,而软连接则不可以并且显示文件不存在。那么硬链接是什么呢?硬链接其实就是一种引用计数,有相同的文件计数++,当我们删除文件的时候先--计数,只有当计数为0才会真正的将文件删除,如下图所示:

ceeebf7efc14448d832afe0f2d82a383.pngc916361289834ba0aaed792c75f8afbd.png


所以我们之前看到的文件属性后面的数字其实就是硬链接数,我们创建几个硬链接这个数字就会加几, 而软连接内部放的是自己所指向的文件的路径,而硬链接就是原始文件的引用。大家看到这里能联想到软连接是windows里面的什么吗?其实就是程序的快捷方式,我们将快捷方式删除是不影响真正的文件本身的,找到其文件路径照样可以打开软件,所以这就是软连接。上面的测试都是以普通文件做测试的,下面我们看看目录是什么样的:

78c96ba8acbb42ba899e10794fcfd5dc.png

为什么一个目录的硬链接数是2呢?通过我们刚刚的描述不难理解,是2的原因一定是因为有一个文件名和映射关系所指向了这个目录,首先目录名和自己的inode就是一个硬链接了,接下来我们进入目录里看看有什么文件指向这个目录:

fe8c20a2c93845c0a9447512d0fe76b0.png


我们发现这个空目录有隐藏文件,一个.和一个..,我们之前讲过.代表当前目录,..代表上级目录,并且最重要的是.这个文件的inode和目录的inode一模一样如下图所示:

48e17a39f0544ff9a3fb48e0668194f5.png


那么..是否和.一个道理呢?答案是是的,..是上级目录的inode,如下图:

78fdbb7c47044ed1a8b27b58eeec6624.png


既然我们刚刚可以给文件加一个硬链接,那么目录是否也能呢,我们试试:

3f059bdc3f7a4b6b814433bd3e9b10aa.png


结果大家已经看到了,我们不能给目录加一个硬链接,这是为什么呢?为什么刚刚的. 和 .. 都能给目录建立硬链接,而我们却不行呢?因为操作系统不允许用户对目录建立硬链接,因为如果给目录建立硬链接容易造成环路的路径问题,如下图:

da7a56997aef40f2a7f3232455175341.png


比如我们给上图中这个路径的107目录建立了硬链接,那么当我们用find进行查找路径的时候,找到了107中的硬链接,然后硬链接又将路径送回到107这样就永远找不到路径了,那么. 和 ..为什么可以避免这个问题呢?因为操作系统对这里做了特殊处理可以判断,而用户如果搞出这样的问题操作系统很难去判断是否造成环路如何解决。


文件的三个时间:


首先查看文件的时间的命令stat + 文件名:

bd2c02a0678446c4b5fb7be2386c5671.png


change是对一个文件的属性做修改的时间如下图所示:

9ccbc281bdf14e26b54207af65aa757e.png

而modify是更改内容的时间,下面我们改一下看看:

35ddb041e6c54dae808740331eb30e71.png

不知道大家有没有发现,我们改内容后属性的时间也跟着变化了,这是因为更改文件内容会改变文件属性中的大小,所以属性也会变。Access是文件的访问时间,下面我们访问试试:

545f5527125244f3b30c4f171b2c182f.png


为什么我们访问了也没改呢?这是因为查看文件内容的比重很高,如果我们高频次的修改文件访问时间,就会高频次的访问磁盘将文件属性写入磁盘,这样会大大的消耗IO交互的成本,所以一般是访问多次修改一次时间。

目录
相关文章
|
3月前
|
安全 Linux vr&ar
Linux的动态库和静态库
Linux的动态库和静态库
|
3月前
|
Linux 索引
在Linux中,符号链接与硬链接有何区别?
在Linux中,符号链接与硬链接有何区别?
|
20天前
|
Linux API 开发工具
FFmpeg开发笔记(五十九)Linux编译ijkplayer的Android平台so库
ijkplayer是由B站研发的移动端播放器,基于FFmpeg 3.4,支持Android和iOS。其源码托管于GitHub,截至2024年9月15日,获得了3.24万星标和0.81万分支,尽管已停止更新6年。本文档介绍了如何在Linux环境下编译ijkplayer的so库,以便在较新的开发环境中使用。首先需安装编译工具并调整/tmp分区大小,接着下载并安装Android SDK和NDK,最后下载ijkplayer源码并编译。详细步骤包括环境准备、工具安装及库编译等。更多FFmpeg开发知识可参考相关书籍。
66 0
FFmpeg开发笔记(五十九)Linux编译ijkplayer的Android平台so库
|
3月前
|
Linux API
在Linux中,程序产生了库日志虽然删除了,但磁盘空间未更新是什么原因?
在Linux中,程序产生了库日志虽然删除了,但磁盘空间未更新是什么原因?
|
4月前
|
Oracle 关系型数据库 Linux
讲解linux下的Qt如何编译oracle的驱动库libqsqloci.so
通过这一连串的步骤,可以专业且有效地在Linux下为Qt编译Oracle驱动库 `libqsqloci.so`,使得Qt应用能够通过OCI与Oracle数据库进行交互。这些步骤适用于具备一定Linux和Qt经验的开发者,并且能够为需要使用Qt开发数据库应用的专业人士提供指导。
139 1
讲解linux下的Qt如何编译oracle的驱动库libqsqloci.so
|
3月前
|
Linux 网络安全 API
【Azure 应用服务】App Service For Linux 环境中,如何从App Service中获取GitHub私有库(Private Repos)的Deploy Key(RSA key)呢?
【Azure 应用服务】App Service For Linux 环境中,如何从App Service中获取GitHub私有库(Private Repos)的Deploy Key(RSA key)呢?
|
3月前
|
小程序 Linux 开发者
Linux之缓冲区与C库IO函数简单模拟
通过上述编程实例,可以对Linux系统中缓冲区和C库IO函数如何提高文件读写效率有了一个基本的了解。开发者需要根据应用程序的具体需求来选择合适的IO策略。
30 0
|
4月前
|
网络协议 Ubuntu Linux
|
16天前
|
运维 安全 Linux
Linux中传输文件文件夹的10个scp命令
【10月更文挑战第18天】本文详细介绍了10种利用scp命令在Linux系统中进行文件传输的方法,涵盖基础文件传输、使用密钥认证、复制整个目录、从远程主机复制文件、同时传输多个文件和目录、保持文件权限、跨多台远程主机传输、指定端口及显示传输进度等场景,旨在帮助用户在不同情况下高效安全地完成文件传输任务。
112 5
|
15天前
|
Linux
Linux系统之expr命令的基本使用
【10月更文挑战第18天】Linux系统之expr命令的基本使用
51 4