Linux讲解 基础IO 软硬链接

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Hanani_Jia/article/details/82803021

  今天我们介绍在Linux文件系统中的软硬链接的概念。

  我们上次说了一个概念,一般情况下都是我们的一个文件名对应一个inode号,但是也存在我们不同的文件名字指向了同一个inode结点的可能性,也就是说我打开的不同文件但是内容确实一样的,这就让我想到了我们windows下边的快捷方式。这就是硬链接。可以用不同的文件名访问同样的内容;对文件内容进行修改,会影响到所有文件名;但是,删除一个文件名,不影响另一个文件名的访问。

  下边我们就在Linux下创建一个硬链接。

ln oldfilename newfilename 就可以创建一个硬链接。

我们通过命令查看文件的inode结点号,发现这两个文件的结点号是一样的,他们两个是同一个inode结点。自然打开文件的内容也是一样的。

 Inode结点里边存储了很多数据,其中一项数据就是文件的链接数,运行ln命令的时候,文件与目标文件的inode号码相同,都指向同一个inode。inode信息中链接数,也就是记录指向该inode的文件名总数,这时就会增加1。反过来,删除一个文件名,就会使得inode节点中的"链接数"减1。当这个值减到0,表明没有文件名指向这个inode,系统就会回收这个inode号码,以及其所对应block区域。

  这里要注意我们的ln命令是不可以对我们的文件夹文件创建硬链接的创建目录时,默认会生成两个目录项:"."和".."。前者的inode号码就是当前目录的inode号码,等同于当前目录的"硬链接";后者的inode号码就是当前目录的父目录的inode号码,等同于父目录的"硬链接"。

  所以我们在理解删除文件的时候就和以前有些不同了,我们不是直接释放我们的空间,我们首先要把inode结点里边的硬链接数目-1,如果这时候是0那就将对应的此判决进行释放。所以我们即使删除了myfile文件之后我们创建的硬链接newfile文件仍然是可以正常打开的。

   软链接Linux中文件共享的另一种方式,我们创建一个软链接。

  创建软链接的命令也是ln但是需要加上-s选项,这时候可以看出来创建出来的newfile颜色就和原来的不一样了。

这时候再去看我们的文件详细属性,发现两个文件的大小都是不一样的,明显和我们的硬链接是不一样的,并且我们去查看我们两个文件的inode结点号。

两个文件的inode的结点是不一样的。

这时候我们尝试删除一下oldfile。

当我们删除oldfile之后发现newfile文件的颜色变成了醒目的红色。

这时候再查看文件内容系统会提示文件不存在。

软链接:文件A和文件B的inode号码虽然不一样,但是文件A的内容是文件B的路径。读取文件A时,系统会自动将访问者导向文件B。因此,无论打开哪一个文件,最终读取的都是文件B。这意味着,文件A依赖于文件B而存在,如果删除了文件B,打开文件A就会报错:"No such file or directory"。这是软链接与硬链接最大的不同:文件A指向文件B的文件名,而不是文件B的inode号码,文件B的inode"链接数"不会因此发生变化。

硬链接:其实就是同一个文件具有多个别名,具有相同inode,而文件名不同。

              1. 文件具有相同的inode和data block;

              2. 只能对已存在的文件进行创建;

              3. 不同交叉文件系统进行硬链接的创建

              4. 不能对目录进行创建,只能对文件创建硬链接

              5. 删除一个硬链接并不影响其他具有相同inode号的文件;

软链接:软链接具有自己的inode,即具有自己的文件,只是这个文件中存放的内容是另一个文件的路径名。因此软链接具有自己的inode号以及用户数据块。

              1. 软链接有自己的文件属性及权限等;

              2. 软链接可以对不存在的文件或目录创建;

              3. 软链接可以交叉文件系统;

              4. 软链接可以对文件或目录创建;

              5. 创建软链接时,链接计数i_nlink不会增加;

              6. 删除软链接不会影响被指向的文件,但若指向的原文件被删除,则成死链接,但重新创建指向 的路径即可恢复为正常的软链接,只是源文件的内容可能变了。

之后在介绍一下动态库和静态库的概念

库就是一段编译好的二进制代码,加上头文件就可以供别人使用。 什么时候我们会用到库呢?一种情况是某些代码需要给别人使用,但是我们不希望别人看到源码,就需要以库的形式进行封装,只暴露出头文件。另外一种情况是,对于某些不会进行大的改动的代码,我们想减少编译的时间,就可以把它打包成库,静态库即静态链接库(Windows 下的 .lib,Linux  .a)。之所以叫做静态,是因为静态库在编译的时候会被直接拷贝一份,复制到目标程序里,这段代码在目标程序里就不会再改变了。如果使用静态库的话,当你编译完之后,你当前的程序就没有了外部依赖直接就可以运行,无论你这个库文件后来被删除了还是怎么样,都不影响你当前的程序,但是也有明显的缺点就是我们的程序变大了。

动态库即动态链接库(Windows 下的 .dll,Linux 下的 .so)。与静态库相反,动态库在编译时并不会被拷贝到目标程序中,目标程序中只会存储指向动态库的引用。等到程序运行时,动态库才会被真正加载进来。 动态库的优点是,不需要拷贝到目标程序中,不会影响目标程序的体积,而且同一份库可以被多个程序使用(因为这个原因,动态库也被称作共享库)。同时,编译时才载入的特性,也可以让我们随时对库进行替换,而不需要重新编译代码。动态库带来的问题主要是,动态载入会带来一部分性能损失,使用动态库也会使得程序依赖于外部环境。如果环境缺少动态库或者库的版本不正确,就会导致程序无法运行。

 要注意动态库是在程序运行的时候采取链接动态库的代码,但是静态库程序在编译链接的时候就把库的代码链接到可执行文件当中。

    对于到底使用静态库还是动态库还是要具体情况具体分析。

猜你喜欢

转载自blog.csdn.net/Hanani_Jia/article/details/82803021