Linux系统编程——动静态库
目录
一,关于动静态库
1.1 什么是库?
1.2 认识动静态库
1.3 动静态库特征
二,静态库
2.1 制作静态库
2.2 使用静态库
三,动态库
3.1 制作动态库
3.2 使用动态库一些问题
3.3 正确使用动态库三种方法
3.3.1 方法一:添加系统环境变量
3.3.2 方法二:改配置文件
3.3.3 方法三:软链接方案
五,一些问题解答
5.1 为什么gcc编译的时候没有指明过库名也能编译?
5.2 为什么要有库?
5.3 进程是如何访问到库中的所有函数的?
一,关于动静态库
1.1 什么是库?
一个可执行程序,由一堆源文件和一堆头文件经过预处理,编译,汇编,链接四个步骤后得来。
我们先写几个简单的头文件和源文件,如下代码:
mymath.h
#pragma onceextern int Add(int x, int y);
mymath.c
#include "mymath.h"int Add(int a, int b)
{return a + b;
}
myprint.h
#pragma once extern void Printf(int x, int y);
myprint.c
#include <stdio.h>
#include "myprint.h"void Printf(int a, int b)
{printf("hello %d\n", Add(a, b));
}
main.c
int main()
{Printf(10, 20);return 0;
}
gcc mymain.c mymath.c myprint.c -o my.exe
① 一般来说,程序都是先通过汇编之后形成.o文件,然后就将所有的.o文件进行链接最终形成可执行程序。那么,如果我把我的.h和.o给别人,别人能用吗?
②当然是可以的,在Linux操作系统下,只需要cp *.o /home/user/ 把.o和.h拷贝到其它用户目录下,其它用户目录就可以使用了。
③但是一些稍微大一点的项目,.o文件会非常非常多,所以我们得把所有的.o文件打个包,这个打包的过程就叫做形成库的过程,这个打好的包就叫做库。
④我们目前见到的库绝大多数其实都是一堆目标文件(.o)的集合,库的文件中并不包含主函数,但是提供了大量的方法以供调用。
1.2 认识动静态库
我们先通过一个最简单的代码来认识库:
#include<stdio.h>
int main()
{printf("hello world\n");return 0;
}
我们gcc编译后生成test可执行程序,运行后成功在屏幕上打印hello world。
我们用ldd test来查看一个可执行程序所依赖的库文件,如下图:
- 在Linux中,.so为后缀的是动态库,.a为后缀的是静态库
- 在Windows中,.dll为后缀的是动态库,.lib为后缀的是静态库
gcc/g++默认是动态链接的,但是我们也可以强制让它变成静态链接,在后面携带一个-static选项即可,如下图:
我们也可以用file查看文件的详细属性:
1.3 动静态库特征
静态库:
静态库是程序在遍历链接时把库的代码原封不动地全部拷贝到源文件中一起编译
优点:使用静态库生成地可执行程序可以直接独立运行,不再需要动态库
缺点:使用静态库生成地可执行程序空间会大很多,就拿上面的图来看,test-s的大小是test的一百多倍。而且这只是包含了一个头文件,当有多个静态程序同时加载相同的库,那么内存会存在大量的重复代码
动态库:
动态库是在程序运行时才会去链接相应的动态库代码的,多个程序共享使用库的代码。
一个与动态库链接的可执行文件只包含了它用到的函数入口地址的一个表,而不是外部函数所在文件的所有数据。在可执行文件运行前,调用的函数所在的库由操作系统从磁盘上先搞到物理内存中,这个过程称为动态链接。然后动态库在多个程序间共享,节省了内存和磁盘的空间,具体步骤如下图:
- 首先,动态库是一个独立的文件,可执行程序也是一个独立的文件,所以动态库和可执行程序是可以分批加载的
- 地址空间最下面的代码区,中间一大块是堆栈,而且堆栈相对而生,但是堆栈中间有一大块镂空区域,我们叫做共享区
- a.out先加载到内存里面,如果在执行时需要访问库代码,这个时候操作系统就把位于磁盘上的动态库的某一个方法加载到物理内存里,然后通过页表建立映射关系,把该方法的虚拟地址放进进程的共享区中
- 然后进程就可以从代码区转到共享区执行完方法再把结果拿回代码区,减少了额外拷贝,只需要改下虚拟地址即可
- 这样,一个进程动态链接后物理内存中的该方法就可以继续为其它的调用这个方法的进程服务,这也就是为什么我们两次运行一个程序,第二次运行比第一次快很多,因为第一次加载的数据,第二次就不需要加载了,可以直接用
优点:能节省磁盘和内存空间,并且多个用到相同动态库的程序同时运行时,库文件会通过进程地址空间进行共享,内存中不会存在重复代码
缺点: 必须依赖动态库,并且动态库的使用比静态库复杂很多,下面的内容会有体会
二,静态库
2.1 制作静态库
就上面的mymath.h和myprintf.h而言,我们可以把它俩打个包,如下图:
ar命令是gnu的归档工具,常用于将目标文件打包为静态库,下面是一些常用选项:
- -r(replace):若静态库文件当中的目标文件有更新,则用新的目标文件替换旧的
- -c(create):建立静态库文件
- -t:列出静态库中的文件
- -v(verbose):显示库的详细信息
一个稍微大的项目都有至少5各源文件,我们一个一个打太慢了,所以我们可以用makefile使其自动化:
libmyhello.a:mymath.o myprint.oar -rc libmyhello.a mymath.o myprint.o
mymath.o:mymath.cgcc -c mymath.c -o mymath.o
myprint.o: myprint.cgcc -c myprint.c -o myprint.o.PHONY:hello
hello:mkdir -p hello/libmkdir -p hello/includecp -rf *.h hello/includecp -rf *.a hello/lib.PHONY:clean
clean:rm -rf *.o libmyhello.a hello
2.2 使用静态库
经过上面的步骤后我们形成了静态库,hello目录的include包含我所有的.h文件,lib包含.a文件。
我们可以先把main.c和hello之外的文件全干掉:
方法一:
gcc的头文件默认搜索路径是:/usr/include 库文件的默认搜索路径是:/lib64 或者 /usr/lib64
我们可以把我们的文件拷贝到这两个目录下:
sudo cp -rf hello/include/* /usr/include/
sudo cp -rf hello/lib/libmyhello.a /lib64
添加了之后,会发现还是编译不过,因为我们自己实现的库还是第三方库,不是系统库也不是C标准库,所以我们需要这样:
gcc main.c -o main -lmyhello
-l 表示要链接库,然后我们之前的.a文件去掉前面的lib和后面的.a剩下的就是库名
方法二:
但是,我们非常不见直接把我们现在写的库文件安装到系统目录下,因为我们目前写的库文件,还没有经过可靠性验证,建议测试完成后直接删掉
sudo rm /usr/include/myprint.h
sudo rm /usr/include/mymath.h
sudo rm /lib64/libmyhello.a
所以我们目前我们要使用我们自己做的静态库,就需要这样:
gcc main.c -I ./hello/include/ -L ./hello/lib/ -lhello
- -I:指定头文件搜素路径(因为编译器不知道你所包含的头文件在哪里,所以需要指定头文件搜索路径)
- -L:指定库文件搜索路径(头文件中只有Add函数和Printf函数的声明,并没有实现,所以需要指定链接库文件的搜素路径)
- -l:指明需要链接库文件路径下的哪一个库(在库文件的lib目录下可能会有大量的库文件,因此我么你需要指明链接库文件路径下的哪一个库)
三,动态库
3.1 制作动态库
动态库大致和静态库一样,但是又些区别。
动态库是以lib开头,以.so结尾的文件,我们还是以这几个文件为例
然后就是制作动态库,如下图:
我们先生成.o目标文件,对应-fPIC有下面几个要注意的点:
- -fPIC作用于编译阶段,其目的是告诉编译器产生与位置无关的代码,这时产生的代码中没有绝对地址,全都是相对路径,使代码可以被加载器加载到内存的任意位置都可以指向。这也是动态库的特点,它在内存中的位置不是固定的
- 如果不加-fPIC选项,则加载.so文件时,其里面的代码端引用的数据对象需要重定位,而重定位会蟹盖代码内容,这就导致每个使用这个.so的进程都会发生写时拷贝,因为每个进程的.so文件代码段和数据段在内存的映射位置不一样
然后我们可以不用ar命令来生成动态库,只需要在gcc命令加上-shared选项即可。
当然我们也一般用makefile来搞这个,如下:
.PHONY:all
add:libhello.so libhello.alibhello.so:mymath_d.o myprint_d.ogcc -shared mymath_d.o myprint_d.o -o libhello.so
mymath_d.o:mymath.cgcc -c -fPIC mymath.c -o mymath_d.o
myprint_d.o:myprint.cgcc -c -fPIC myprint.c -o myprint_d.olibhello.a:mymath.o myprint.oar -rc libhello.a mymath.o myprint.o
mymath.o:mymath.cgcc -c mymath.c -o mymath.o
myprint.o: myprint.cgcc -c myprint.c -o myprint.o.PHONY:output
output:mkdir -p output/libmkdir -p output/includecp -rf *.h output/includecp -rf *.a output/libcp -rf *.so output/lib.PHONY:clean
clean:rm -rf *.o *.a *.so output
先make生成.so文件,在make output生成目录
3.2 使用动态库一些问题
和静态库一样,我们只保留output目录和main.c
然后我们也可以用-I,-L和-l三个选项来生成可执行文件,如下图:
为什么呢,我们ldd a.out可以发现gcc默认使用 /lib64目录下的动态库而不是我们output目录里的那个:
当我们把.so搞到当前目录下发现又能用了。如下图:
如果我们只有静态库,gcc只能针对该库进行静态链接,如果我强转使用静态库,只能gcc main.c -I output/include -L output/lib -lhello -static 摈弃默认优先使用动态库的原则,而是直接使用静态库的方案。如果动静态库都存在,gcc默认用动态库
问题一:那为什么动态库运行报错了呢?
根据1.2 的动态库原理可知,我们的程序和库是分批加载的,加载程序的时候动态库未加载,所以会报错
问题二:gcc编译的时候我不是已经告诉你库的位置了吗?
这里的“你”指的是gcc,你只是告诉了gcc库的位置,没有告诉可执行程序,所以你需要告诉你的加载器的位置
3.3 正确使用动态库三种方法
3.3.1 方法一:添加系统环境变量
与动态库有关的环境变量名为:LD_LIBRARY_PATH,其中LD是加载的意思,LIBRARY就是库的意思。
我们可以先查找我们库的路径,然后添加到该环境变量中,如下图:
但是该环境变量有缺点,就是当shell关闭后,环境变量就重置了
3.3.2 方法二:改配置文件
系统中存在一个默认的动态库搜搜路径:ls /etc/ld.so.conf.d/。我们只需要在这个路径下也创建一个.conf后缀的文件,然后把我们的库文件的路径vim写到里面就可以了,如下图:
(建议测试完就rm掉,因为不建议改配置文件)
sudo rm /etc/ld.so.conf.d/mylibrary.conf
3.3.3 方法三:软链接方案
我们ldd a.out发现它默认使用的是动态库,且动态库路径为 /lib64/libhello.so,但是它找不到这个嘛,那么我们就用一个软链接将它那个.so和我们这个.so链接起来就好了,如下图:
sudo ln -s /home/dyk/testdir/output/lib/libhello.so /lib64/libhello.so
(其实也可以直接把我们的libhello.so拷贝到这个目录下,也能正常运算a.out)
五,一些问题解答
5.1 为什么gcc编译的时候没有指明过库名也能编译?
gcc就是用来编译C与语言的,gcc编译时默认就是找到C标准库,但是我们要链接的是哪一个库,编译器是不知道的,所有需要使用 -l 选项指明链接库文件路径下的具体的库名
5.2 为什么要有库?
站在使用库的人的角度来看,库的存在能大大减少开发的周期,大步幅提高软件本身的质量
站在编写库的人得角度,它得任务就是编写库,只需要关系库得实现,不关心库得使用,能使减少编写库得人的工作量,也能提高库的质量
5.3 进程是如何访问到库中的所有函数的?
每一个动态库被加载到内存,映射到进程的地址空间,映射的位置可能是不一样的,但是因为库里面是相对地址,每一个函数定位采用的是偏移量的方式。
换句话说,只要知道了这个库的相对地址,库的起始地址,就可以通过库的起始地址和虚拟地址 + 函数偏移量,就可以在自己的地址空间中访问库的所有函数了
相关文章:
Linux系统编程——动静态库
目录 一,关于动静态库 1.1 什么是库? 1.2 认识动静态库 1.3 动静态库特征 二,静态库 2.1 制作静态库 2.2 使用静态库 三,动态库 3.1 制作动态库 3.2 使用动态库一些问题 3.3 正确使用动态库三种方法 3.3.1 方法一&…...
json formatter哪个好用
在众多的JSON Formatter工具中,确实有几个相当出色的选择,它们各自拥有独特的特点和优势,可以满足不同用户群体的需求。下面就来为大家推荐几个好用的JSONFormatter工具: 1. JSON Formatter & Validator:这款工具…...
react的hooks是什么意思
React Hooks 是 React 16.8 版本引入的一个新特性,它允许你在不编写类组件的情况下使用状态和其他React特性。Hooks使得函数组件变得更加灵活和强大,因为你可以在其中添加状态逻辑、生命周期方法以及其他React功能。 在传统的React类组件中,…...
AVFrame相关接口(函数)
分配和释放 分配 AVFrame AVFrame *av_frame_alloc(void); 分配一个新的 AVFrame 并返回一个指向它的指针。返回的 AVFrame 需要手动释放。 释放 AVFrame void av_frame_free(AVFrame **frame); 释放由 av_frame_alloc 分配的 AVFrame。这个函数会释放帧的数据并将指针设为 …...
低代码与人工智能的深度融合:行业应用的广泛前景
引言 在当今快速变化的数字化时代,企业面临着越来越多的挑战和机遇。低代码平台和人工智能技术的兴起,为企业提供了新的解决方案,加速了应用开发和智能化转型的步伐。 低代码平台的基本概念及发展背景 低代码平台是一种软件开发方法&#x…...
嵌入式测试基础知识
1.白盒测试也称为结构测试,主要用于检测软件编码过程中的错误。 2.黑盒测试又称为功能测试,主要检测软件的每一个功能是否能够正常使用。 3.软件测试流程:根据测试需求编写测试计划、方案,测试用例,做测试分析&#…...
基于网关的ip频繁访问web限制
一、前言 外部ip对某一个web进行频繁访问,有可能是对web进行攻击,现在提供一种基于网关的ip频繁访问web限制策略,犹如带刀侍卫,审查异常身份人员。如发现异常或者暴力闯关者,即可进行识别管制。 二、基于网关的ip频繁访…...
GSM信令流程(附着、去附着、PDP激活、修改流程)
1、联合附着流程 附着包括身份认证、鉴权等 2、去附着流程 用户发起去附着 SGSN发起去附着 HLR发起去附着 GSSN使用S4发起去附着 3、Activation Procedures(PDP激活流程) 4、PDP更新或修改流程 5、Deactivate PDP Context 6、RAU(Routeing Area Update)流程 7、鉴权加…...
OAK相机如何将 YOLOv10 模型转换成 blob 格式?
编辑:OAK中国 首发:oakchina.cn 喜欢的话,请多多👍⭐️✍ 内容可能会不定期更新,官网内容都是最新的,请查看首发地址链接。 Hello,大家好,这里是OAK中国,我是Ashely。 专…...
【Python】解决Python报错:AttributeError: ‘class‘ object has no attribute ‘xxx‘
🧑 博主简介:阿里巴巴嵌入式技术专家,深耕嵌入式人工智能领域,具备多年的嵌入式硬件产品研发管理经验。 📒 博客介绍:分享嵌入式开发领域的相关知识、经验、思考和感悟,欢迎关注。提供嵌入式方向…...
反思 GTC 和 OFC 2024:没有一刀切的方法,但上市时间是关键!
在GTC 2024期间,英伟达宣布了最新的Blackwell B200张量核心GPU,旨在为万亿参数的AI大型语言模型提供支持。Blackwell B200需要先进的800Gbps网络,完全符合在AI工作负载的AI网络报告中概述的预测。随着人工智能工作负载的流量预计每两年增长10…...
速盾:bgp 静态 cdn
BGP(边界网关协议)是一种用于在互联网中交换路由信息的协议,它允许不同自治系统(AS)之间的路由器进行通信和交换路由信息。CDN(内容分发网络)是一种通过将内容分散放置在全球各地的服务器上&…...
union all 以及标量子查询执行计划
SELECT 1, (SELECT ID1 FROM TE WHERE IDA.ID2) FROM .TA A WHERE COLA X UNION ALL SELECT 1, (SELECT ID2 FROM TD WHERE IDA.ID1) FROM .TB A WHERE COLA X UNION ALL SELECT 1,COL2 AS PARENT_UUID FROM .TC a WHERE COLA X 三个union all 看着像是5个table joi…...
上位机图像处理和嵌入式模块部署(f103 mcu和Qt上位机联动)
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 之前我们写过一篇文章,上面说的是如何利用串口对mcu进行控制,即如果利用串口实现mcu led灯的点亮和熄灭。输入1的时候&…...
TiKV学习5:TiDB SQL执行流程
目录 1. DML语句读流程概要 2. DML语句写流程概要 3. DDL 流程概要 4. SQL的Parse和Compile 5. 读取的执行 6. 写入的执行 7. DDL的执行 8. 小结 1. DML语句读流程概要 TiDB Server接收sql并处理,TiKV负责持久化数据,PD提供TSO和Region的数据字典…...
Unity 自定义编辑器根据枚举值显示变量
public class Test : MonoBehaviour {[HideInInspector][Header("数量")][SerializeField]public int num;[Header("分布类型")][SerializeField]public DistributionType distType;[HideInInspector][Header("位置")][SerializeField]public Li…...
linux下 搭建Llama3
安装软件: Ollama,官方网站:https://ollama.com/ 可以再下载win、mac和linux版本 linux安装命令为:curl -fsSL https://ollama.com/install.sh | sh 由于我的机器是linux不联网机器,网上没找到下载离线方式,…...
【蓝桥杯——物联网设计与开发】拓展模块2 - 电位器模块
一、电位器模块 (1)资源介绍 🔅原理图 蓝桥杯物联网竞赛实训平台提供了一个拓展接口 CN2,所有拓展模块均可直接安装在 Lora 终端上使用; 图1 拓展接口 电位器模块电路原理图如下所示: 图2 …...
Jtti:租用的php服务器运行异常是什么原因导致的?
PHP服务器运行异常可能由多种原因引起。以下是一些常见问题及其相应的解决方案: 1. 服务器资源不足 原因: CPU、内存或磁盘空间不足,导致服务器性能下降。 解决方案: 检查系统资源:使用以下命令检查CPU、内存和磁盘使用…...
恒创科技:无法与服务器建立安全连接怎么解决?
在使用互联网服务时,有时会出现无法与服务器建立安全连接的问题,此错误消息通常出现在尝试访问需要安全连接的网站(例如使用 HTTPS 的网站)时,这可能是由于多种原因造成的,以下是一些常见的解决方法,帮助你解决问题。 …...
【面试】介绍一下HotSpot虚拟机
目录 1. 说明2. 起源与发展3. 技术特点3.1 热点代码探测技术3.2 内存管理3.3 垃圾收集器3.4 并发和多线程支持3.5 指令重排优化 4. 执行模式与性能 1. 说明 1.HotSpot虚拟机是一款由Oracle JDK和OpenJDK广泛使用的Java虚拟机(JVM)。2.HotSpot虚拟机凭借…...
【测试】linux快捷指令工具cxtool
简介 登录linux时,我们经常需要重复输入一些指令. 这个工具可以把这些指令预置,需要的时候鼠标一点,会自动按预置的字符敲击键盘,敲击出指令. 下载地址 https://download.csdn.net/download/bandaoyu/89379371 使用方法 1,编辑配置文件,自定义自己的快捷指令。 2…...
css属性值的计算过程
1.首先抛出一个问题,为什么最终’a’标签渲染的颜色是蓝色。 <div><a>click</a> </div>div {color: red }为什么a标签没有继承父元素的color属性? 2.先抛出一个结论:每一个元素必须拥有全部css属性并且有值浏览器才…...
看到大厂工时爆料,我沉默了。。
大厂工时爆料 今天逛脉脉的时候,看到一篇名为「一人一句,大厂工时爆料」的帖子: 点开之后,我沉默了 ... 出来爆料的基本上都是 10 小时。 好奇心之下,我搜索了一下去年很热的排行榜: 2023 年最新互联网公司…...
最大回撤概念与计算
一、最大回撤,是指的最大下跌的值: 1、即所有下跌趋势中,净值最低的点,与历史净值最高点直接的差值。 2、最大回撤取绝对值显示 二、如果有时间限制,则计算对应时间段内的最大回撤。 示意图如下: 三、举…...
K8s Ingress 详解
文章目录 K8s Ingress 详解Ingress 资源清单Ingress 基于URL 实现路由Ingress 基于名称虚拟主机Ingress 实现HTTPS创建TLS 证书创建Secrets配置ingress Ingress RewriteIngress 灰度发布Ingress 配置认证 K8s Ingress 详解 Ingress 资源清单 apiVersion: networking.k8s.io/v…...
大模型的崛起与未来展望
人工智能技术的飞速发展,令人不得不感叹科技的进步究竟有多么惊人。近年来兴起的大模型,在多个领域都展现出了令人瞩目的能力,引发了业界和大众的广泛关注。从自然语言处理到计算机视觉,从医疗诊断到金融分析,大模型都在不断刷新人类的认知边界。 但我们同时也要看到,大模型目…...
让WSL内核使用BBR拥塞控制算法
使用git命令从Linux内核的Git仓库中获取源代码,$ git clone --depth 1 https://github.com/microsoft/WSL2-Linux-Kernel.git,找到对应的内核版本$ git log --grep="5.15.146.1-microsoft-standard-WSL2",回退到本机安装的内核版本$ git checkout <commit-id&…...
小程序内的分包与数据共享
一:数据共享 小程序内的数据共享和vue当中不一样,vue当中的vue实例可以使得所有的组件都能this.store 但是小程序它只有page对象,和组件实例对象.对于vue而言,vue实例可以使得添加的组件都有. 但是page对象页面对象,不能使得页面内部有.只能使得这个页面内能访问.vue实例,会…...
WordPress子比主题美化-首页动态的图片展示
WordPress子比主题首页动态的图片展示 WordPress子比主题首页添加动态的图片展示,其他程序也可以用,复制代码到相应位置即可,也可作为指定分类,重点内容等,可以适合各个场景,需要的自取。 图片展示: 教程…...
jsp实验19 File
三、源代码以及执行结果截图: readJSPFile.jsp <% page contentType"text/html" %> <% page pageEncoding "utf-8" %> <% page import"java.io.*"%> <style> #tom{ font-family:宋体;font-size:2…...
【OpenVINO™】在C#中使用 OpenVINO™ 部署 YOLOv10 模型实现目标
文章目录 1. 前言1.1 OpenVINO™ C# API1.2 YOLOv10 2. 模型获取2.1 源码下载2.2 配置环境2.3 下载模型 3. Yolov10 项目配置3.1 项目创建与环境配置3.2 定义模型预测方法3.2.1 定义目标检测模型方法3.2.2 使用OpenVINO™ 预处理接口编译模型 3.2 模型预测方法调用 4. 项目运行…...
RabbitMQ 如何保证消息不丢失
开启消息确认机制: 在发布消息时,可以设置deliveryMode为2(持久化),以确保消息不会因为RabbitMQ的崩溃而丢失。 使队列持久化: 通过设置durable为true,可以确保队列在RabbitMQ重启后依然存在。…...
【技术突破】合合信息新品震动业界,TextIn智能抽取,是不是藏了黑科技?
官.网地址:合合TextIn - 合合信息旗下OCR云服务产品 随着文本数据关系的日益复杂化,传统的信息抽取技术面临着诸多挑战。深度学习模型的训练往往需要大量的高质量标注的训练样本,依赖规则实现上下文对话,新样本如果变换了行文方式…...
Transformer模型学习(1)
Transformer模型,它自2017年被引入以来,已成为处理语言任务的主流技术。Transformer模型不仅在多个语言处理任务上取得了优异的成绩,而且还因为它的设计极大地推动了后续模型的发展,如今广泛应用于聊天机器人、翻译软件和文本生成…...
TinTinLand Web3 + AI 共学月|五周上手,捕获浪潮碰撞下的无限机遇
近期,斯坦福大学人文x人工智能研究所(Stanford HAI)发布了《2024 年人工智能指数报告》(Artificial Intelligence Index Report 2024),指出当前人工智能的发展已全面改变社会的前沿风向,其中据 …...
渗透课程第二阶段--Part1--信息收集
目录 一. 为什么要做信息收集? 渗透测试的流程 信息收集包括的内容 学习框架: 二. 分类 1. 域名相关信息 域名(Domain Name)是什么 域名的分类 域名联系人信息 子域名信息 域名DNS信息 2. IP相关信息 ping/nslookup …...
ubuntu22 搭建nginx高可用集群(VIP(keepalived) + 负载均衡)
#在所有节点安装nginx #ps: 如果要使用tcp流转发:需用二进制包安装 make编译时加入stream流的参数。 推荐直接安装openresty【默认支持stream等nginx模块,还附带了很多常用的lua库】 apt install -y net-tools sudo apt install -y nginx vim /etc/…...
QT 编译Lua 动态库,使用Lua脚本混合编程
一,编译Lua动态库 1,下载lua源码 地址:Lua: downloadhttps://www.lua.org/download.html 2,配置 解压lua源码压缩包,里面有个src文件夹,里面的代码就是lua的源码...
关于不均衡数据的探究
1、不均衡数据指什么 不均衡数据是指在一个数据集中,某些类别(或标签)的样本数量明显少于其他类别的样本数量,也就是说不同类别的样本分布不均匀。这样的数据集在分类问题中非常常见。 2、不均衡数据的特征 类别比例失衡…...
LwIP 之十 详解 TCP RAW 编程、示例、API 源码、数据流
我们最为熟知的网络通信程序接口应该是 Socket。LwIP 自然也提供了 Socket 编程接口,不过,LwIP 的 Socket 编程接口都是使用最底层的接口来实现的。我们这里要学习的 TCP RAW 编程则是指的直接使用 LwIP 的最底层 TCP 接口来直接实现应用层功能。这里先来一张图,对 LwIP 内部…...
【京东评论】数据源——Python提升获取效率▼
这不是我的第一个爬虫,但大多数都是像这样简单粗暴的,因为一开始对于定义函数,然后再相应 相应的操作,是比较困难的,这能直接写for循环语句。 首先,我们要明确我们的目标:从京东上爬取产品的评…...
Java大厂面试题第2季
一、本课程前提要求和说明 面试题1: 面试题2: 面试题3: 面试题4: 面试题5: 高频最多的常见笔试面试题目 ArrayList HashMap 底层是什么东东 JVM/GC 多线程与高并发 java集合类...
探索无限可能性——微软 Visio 2021 改变您的思维方式
在当今信息化时代,信息流动和数据处理已经成为各行各业的关键。微软 Visio 2021 作为领先的流程图和图表软件,帮助用户以直观、动态的方式呈现信息和数据,从而提高工作效率,优化业务流程。本文将介绍 Visio 2021 的特色功能及其在…...
Linux CFS调度器之周期性调度器scheduler_tick函数
文章目录 前言一、简介二、源码分析2.1 scheduler_tick2.2 task_tick2.3 entity_tick2.4 check_preempt_tick2.5 resched_curr 参考资料 前言 Linux内核调度器主要是主调度器和周期性调度器,主调度器请参考:Linux 进程调度之schdule主调度器 一、简介 …...
git生成密钥(免密)
生成SSH密钥对的方法如下: 打开Git Bash。 输入以下命令生成新的SSH密钥对: ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" 这里的 -C 参数后面跟的是你的邮箱地址,通常用于标识这个密钥。 当系统提示你“Enter a fil…...
山东大学软件学院2021级编译原理回忆版
一、判断题 1、正则文法可以表示一般的高级程序语言,构成其语法成分和生成句子() 2、NFA的状态和符号有且只有一条边,因此看起来更直观() 3、DFA无法表示这样的语言{anbn,n>1}() …...
为什么都说视频号小店值得做,具体该怎么做?新手必学
大家好,我是电商花花。 所有人都在告诉你2024年应该做视频号小店,但没有人告诉你到底应该怎么做。 今天给大家说一下为什么2024年都推荐大家去做视频号小店,以及分享一些视频号小店的实操干货,可以帮助大家更快更稳的做店。 首先…...
网络安全岗秋招面试题及面试经验分享
Hello,各位小伙伴,我作为一名网络安全工程师曾经在秋招中斩获🔟个offer🌼,并在国内知名互联网公司任职过的职场老油条,希望可以将我的面试的网络安全大厂面试题和好运分享给大家~ 转眼2024年秋招又快到了金…...
如何实现一个AI聊天功能
最近公司的网站上需要对接一个AI聊天功能,领导把这个任务分给了我,从最初的调研,学习,中间也踩过一些坑,碰到过问题,但最后对接成功,还是挺有成就感的,今天把这个历程和项目整理一下…...