【linux深入剖析】深入理解软硬链接 动静态库的制作以及使用(1)

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前在阿里

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Linux运维全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上运维知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

需要这份系统化的资料的朋友,可以点击这里获取!

可以看到我们修改目标文件的同时,硬链接生成的文件也会发生变化,其大小与目标文件同样是12,且修改时间相同,inode也没有改变

  • 我们删除目标文件
    在这里插入图片描述

可以看到,我们的硬链接产生的文件并没有什么变化,我们查看其文件数据可以清楚的看到,这个数据就是我们当初输入到目标文件的数据,这是什么情况?

其实也可以理解,其inode和目标文件是一摸一样的,也就是说他们对应的都是同一个文件,我们硬链接的工作特别像给目标文件进行一个重命名,并且源文件不改变。

硬链接的本质:一定没有新建文件,因为没有新的inode,只是新建了一个文件名,与目标文件inode相同的映射关系。


这个时候我们再看当初的这个2
在这里插入图片描述

其实这就是一个硬链接数,表明有多少个硬链接,表明了有多少个文件名与这一块数据有相同的映射关系,同时也叫引用计数

同时可以看到,硬链接就是建立了一个映射关系同时对引用计数++即可。

我们删掉文件后可以看到,引用计数从2变成了1
在这里插入图片描述


测试软链接

在这里插入图片描述
软链接创建的文件有独立的inode,有独立的inode那么就有独立的属性以及独立的数据内容。

软链接本质就是一个独立文件,软链接内容里面放的目标文件的路径!

软链接就相当于我们Windows里面的快捷方式,其存储的就是其可执行程序的路径

1.3 软硬链接的应用场景

1.3.1软链接
  • 我们创建一系列文件并输入内容给test.c

在这里插入图片描述

#include<stdio.h>
int main()
{
  printf("hello world\n");
  return 0;
}

  • 将文件编译,并把可执行文件移动到bin目录下

在这里插入图片描述

  • 我们想访问这个可执行文件就只能访问绝对路径访问

在这里插入图片描述

  • 我们还可以采用软链接的方式访问到这个可执行文件

在这里插入图片描述
我们就可以使用软链接的方式,在当前目录创建一个软链接的文件,这样就可以直接访问到深路径的文件,我们使用起来就更加方便


我们也可以采用硬链接的方式来达到访问深路径的文件
在这里插入图片描述

软链接使用起来还是更加方便一些,一般推荐软链接


系统有很多的软链接

ls -l /lib64/

在这里插入图片描述


1.3.2 硬链接
  • 我们创建一个普通文件以及一个目录
    在这里插入图片描述

可以发现普通文件的硬链接数是1,而目录一创建出来硬链接数就是2。

  • 我们进入empty目录下

在这里插入图片描述

我们可以看到empty目录下有隐藏的点文件,我们之前讲过,这个就是指的当前目录,它的inode与empty目录的inode是一模一样的,而它就是除了empty外另一个硬链接。

  • 我们进入empty目录下再创建一个a目录

在这里插入图片描述

这里可以看到我们的empty目录的硬链接数变成了3,这就是因为我们empty目录里的a目录里有一个自带的点点文件,这代表的是上级目录,它就是第三个empty目录的硬链接

由此得知:一个目录下有多少个子目录:硬链接数-2即可计算得到

注意:Linux中不允许给目录建立硬链接,但是可以建立软链接


2.动静态库

  • 静态库(.a):程序在编译链接的时候把库的代码链接到可执行文件中。程序运行的时候将不再需要静态库
  • 动态库(.so):程序在运行的时候才去链接动态库的代码,多个程序共享使用库的代码。
  • 一个与动态库链接的可执行文件仅仅包含它用到的函数入口地址的一个表,而不是外部函数所在目标文件的整个机器码
  • 在可执行文件开始运行以前,外部函数的机器码由操作系统从磁盘上的该动态库中复制到内存中,这个过程称为动态链接(dynamic linking)
  • 动态库可以在多个程序间共享,所以动态链接使得可执行文件更小,节省了磁盘空间。操作系统采用虚拟内存机制允许物理内存中的一份动态库被要用到该库的所有进程共用,节省了内存和磁盘空间。

我们是很经常使用库的,我们创建一个普通C文件,并编写简单代码

在这里插入图片描述

这里就是利用了C语言的库的,之前进行简单的讲解过,这是C语言的动态库

在这里插入图片描述


关于库我们有过一定的使用经验
库分为静态库以及动态库-----大部分的系统默认安装的是动态库,云服务器是静态库–(C标准库)默认是没有安装的
默认编译程序,用的是动态链接的,如果要静态要加-static

库的真实名字:lib. XXXX -a/so 去掉前缀以及后缀

2.1 动静态库的制作和使用

一般我们的程序执行会经历几个阶段

  1. a.h + a.c ---> a.o
  2. b.h + b.c ---> b.o
  3. c.h + c.c ---> c.o
  4. d.h + d.c ---> d.o
  5. 再结合libc.so/libc.a
  6. 最后main.c ------>main.o

库则是不提供.c文件

  1. a.h + a.o
  2. b.h + b.o
  3. c.h + c.o
  4. d.h + d.o

你只需要将main.c ------>main.o
注:这里的a、b、c、d只是概念文件

所谓的库就是将所有的.o文件用特定的方式,进行打包,形成一个文件

库的存在的意义:

  1. 提高开发效率
  2. 隐藏源代码

准备工作

在了解库的使用原理后我们来模拟实现一个

  1. 创建五个文件
    在这里插入图片描述
  2. 编写文件

add.c

#include "add.h"
int add(int a, int b)
{
  return a + b;
}


add.h

#ifndef \_\_ADD\_H\_\_
#define \_\_ADD\_H\_\_ 
int add(int a, int b); 
#endif // \_\_ADD\_H\_\_


sub.h

#ifndef \_\_SUB\_H\_\_
#define \_\_SUB\_H\_\_ 
int sub(int a, int b); 
#endif // \_\_SUB\_H

sub.c

#include "add.h"
int sub(int a, int b)
{
  return a - b;
}

main.c

#include <stdio.h>
#include "add.h"
#include "sub.h"
 
int main()
{
  int a = 10;
  int b = 20;
  printf("add(%d, %d)=%d\n", a, b, add(a, b));
  a = 100;
  b = 20;
  printf("sub(%d,%d)=%d\n", a, b, sub(a, b));
}

生成.o文件
在这里插入图片描述

生成静态库

指令ar -rc

ar -rc是一个用于创建或更新静态库的命令。它是GNU工具链中的一个工具,用于将一组目标文件打包成一个静态库文件。下面是ar -rc命令的一些常见用法:

  • 创建静态库:可以使用ar -rc命令将多个目标文件打包成一个静态库文件。例如,要将文件1.o、文件2.o和文件3.o打包成一个名为libexample.a的静态库,可以执行以下命令:

ar -rc libexample.a 1.o 2.o 3.o

  • 更新静态库:如果已经存在一个静态库文件,可以使用ar -rc命令向其中添加新的目标文件或替换已有的目标文件。例如,要向名为libexample.a的静态库中添加一个新的目标文件file.o,可以执行以下命令:

ar -rc libexample.a file.o

  • 替换静态库中的目标文件:如果要替换静态库中已有的目标文件,可以使用ar -rc命令指定相同的目标文件名。例如,要替换名为libexample.a的静态库中的目标文件file.o,可以执行以下命令:

ar -rc libexample.a file.o

  • 查看静态库内容:可以使用ar -t命令来查看静态库中包含的目标文件列表。例如,要查看名为libexample.a的静态库中包含的目标文件列表,可以执行以下命令:

ar -t libexample.a


输入指令ar -rc libmymath.a add.o sub.o生成静态库
查看静态库中的目录列表 ar -tv libmymath.a
t:列出静态库中的文件
v:verbose 详细信息

在这里插入图片描述
所以库的本质就是把一堆.o打包形成一个文件,然后通过头文件来调用库。注意,库中不能包含main函数。

编译一下,即可运行

gcc (要形成的可执行文件名) main.c(所依赖的文件) -L .(-L + 路径表示myc这个库在哪个路径下)-lmymath(指明要链接mymath这个静态库)

在这里插入图片描述


生成动态库

fPIC:产生位置无关码,在将.c或者.cpp形成.o文件时,需要加上-fPIC。要形成动态库必须加上-fPIC。
在这里插入图片描述

为了做好运维面试路上的助攻手,特整理了上百道 【运维技术栈面试题集锦】 ,让你面试不慌心不跳,高薪offer怀里抱!

这次整理的面试题,小到shell、MySQL,大到K8s等云原生技术栈,不仅适合运维新人入行面试需要,还适用于想提升进阶跳槽加薪的运维朋友。

本份面试集锦涵盖了

  • 174 道运维工程师面试题
  • 128道k8s面试题
  • 108道shell脚本面试题
  • 200道Linux面试题
  • 51道docker面试题
  • 35道Jenkis面试题
  • 78道MongoDB面试题
  • 17道ansible面试题
  • 60道dubbo面试题
  • 53道kafka面试
  • 18道mysql面试题
  • 40道nginx面试题
  • 77道redis面试题
  • 28道zookeeper

总计 1000+ 道面试题, 内容 又全含金量又高

  • 174道运维工程师面试题

1、什么是运维?

2、在工作中,运维人员经常需要跟运营人员打交道,请问运营人员是做什么工作的?

3、现在给你三百台服务器,你怎么对他们进行管理?

4、简述raid0 raid1raid5二种工作模式的工作原理及特点

5、LVS、Nginx、HAproxy有什么区别?工作中你怎么选择?

6、Squid、Varinsh和Nginx有什么区别,工作中你怎么选择?

7、Tomcat和Resin有什么区别,工作中你怎么选择?

8、什么是中间件?什么是jdk?

9、讲述一下Tomcat8005、8009、8080三个端口的含义?

10、什么叫CDN?

11、什么叫网站灰度发布?

12、简述DNS进行域名解析的过程?

13、RabbitMQ是什么东西?

14、讲一下Keepalived的工作原理?

15、讲述一下LVS三种模式的工作过程?

16、mysql的innodb如何定位锁问题,mysql如何减少主从复制延迟?

17、如何重置mysql root密码?

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以点击这里获取!

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

nx有什么区别,工作中你怎么选择?

7、Tomcat和Resin有什么区别,工作中你怎么选择?

8、什么是中间件?什么是jdk?

9、讲述一下Tomcat8005、8009、8080三个端口的含义?

10、什么叫CDN?

11、什么叫网站灰度发布?

12、简述DNS进行域名解析的过程?

13、RabbitMQ是什么东西?

14、讲一下Keepalived的工作原理?

15、讲述一下LVS三种模式的工作过程?

16、mysql的innodb如何定位锁问题,mysql如何减少主从复制延迟?

17、如何重置mysql root密码?

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以点击这里获取!

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值