Linux:软硬链接和动静态库
hello,各位小伙伴,本篇文章跟大家一起学习《Linux:软硬链接和动静态库》,感谢大家对我上一篇的支持,如有什么问题,还请多多指教 !
如果本篇文章对你有帮助,还请各位点点赞!!!
话不多说,开始正题:
文章目录
- 创建软硬链接
- 理解软硬链接
- 为什么要有软硬链接?
- 静态库
- 方法一:安装到系统里
- 方法二:和源文件在一起
- 方法三:使用带路径的库
- 动态库
- 方法一:把动态库安装到系统中
- 方法二:和源文件在一起
- 方法三:使用带路径的库
- 解决问题
- 同时提供动静态库,系统会选择哪一个?
- 原理上理解动态库
创建软硬链接
软连接:
ln -s 目标文件 软连接文件
看到file-sort.link
有自己的inode
,这就说明file-sort.link
是一个独立的文件,向file.txt
里写入东西:
发现可以从软链接中获取file.txt
的内容,接下来创建硬链接:
ln 目标文件 软连接文件
发现硬链接的inode
和目标文件的一样,说明硬链接不是一个独立的文件,发现目标文件的数字1
变成了2
,要是把硬链接给删掉:
又变回数字1
了
理解软硬链接
- 软链接实际上就是保存你目标文件的路径,就像我们Windows的快捷方式,点击桌面的快捷方式就可以打开文件
- 硬链接本质就是一组文件名和已经存在的文件的映射关系,可以理解为给文件多取了一个新的名字
- 为什么数字会变成
2
?其实这里的数字表示的是映射关系的个数,在这里有两个文件名指向目标文件,所以数字就会变成2,但要是把硬链接给删除,数字就变回了1 - 实际上就是
inode
里维护着一个引用计数(也叫做硬链接数)记录着有多少个文件名指向着文件,所以要把一个文件真正的删除,就要把所有指向该文件的文件名全部删除,也就是引用计数为0 - 要是把原先文件名给删掉,那不就相当于给我文件进行重命名了吗?但是要注意,这时候的软链接就失效了,因为该软链接找不到文件名了
为什么要有软硬链接?
软链接:
可以直接将可执行程序通过软链接直接链接到/usr/bin/
目录底下,这样就可以直接执行可执行程序不需要带路径了
想要删掉软链接也可以使用unlink
:
删除后再运行code就找不到了
也可以对目录进行软链接,比如有些目录路径太深了,就可以使用软链接到当前目录,所以软链接最主要的作用就是方便操作
对于硬链接,创建一个空目录,这个目录默认就有两个链接数:
这是因为对于这个目录有两个文件名指向它,一个是empty
,另一个是.
,没错这个.
就是表示当前目录的意思,所以数字是2
当我在该空目录底下创建一个新目录dir
:
就会发现链接数变成了3,那是因为新目录dir
有..
来指向上级目录,所以多了一个链接数
但是根目录有点特殊,因为是被特殊处理过的,当在根目录想继续切换到上级目录:
cd ..
是停留在根目录的,因为根目录这个..
是特殊处理过的,也不影响链接数,也删不掉
硬链接可以对大文件进行备份并且不需要进行拷贝,节省空间的拷贝
但是,Linux
中不允许对目录新建硬链接:
因为会形成环形路径:
软链接就不会,因为系统不会对软链接进行解析,读到软链接就不继续操作了,但是操作系统就可以创建目录的硬链接.
和..
嘛,你别管,操作系统就是老大
静态库
方法一:安装到系统里
先创建一些头文件和.o
文件来创建静态库:
my_stdio.c:
#include "my_stdio.h"
#include <string.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <fcntl.h>
#include <unistd.h>mFILE *mfopen(const char *filename, const char *mode)
{int fd = -1;if(strcmp(mode, "r") == 0){fd = open(filename, O_RDONLY);}else if(strcmp(mode, "w")== 0){fd = open(filename, O_CREAT|O_WRONLY|O_TRUNC, 0666);}else if(strcmp(mode, "a") == 0){fd = open(filename, O_CREAT|O_WRONLY|O_APPEND, 0666);}if(fd < 0) return NULL;mFILE *mf = (mFILE*)malloc(sizeof(mFILE));if(!mf) {close(fd);return NULL;}mf->fileno = fd;mf->flag = FLUSH_LINE;mf->size = 0;mf->cap = SIZE;return mf;
}void mfflush(mFILE *stream)
{if(stream->size > 0){// 写到内核文件的文件缓冲区中!write(stream->fileno, stream->outbuffer, stream->size);// 刷新到外设fsync(stream->fileno);stream->size = 0;}
}int mfwrite(const void *ptr, int num, mFILE *stream)
{// 1. 拷贝memcpy(stream->outbuffer+stream->size, ptr, num);stream->size += num;// 2. 检测是否要刷新if(stream->flag == FLUSH_LINE && stream->size > 0 && stream->outbuffer[stream->size-1]== '\n'){mfflush(stream);}return num;
}void mfclose(mFILE *stream)
{if(stream->size > 0){mfflush(stream);}close(stream->fileno);
}
my_stdio.h:
#pragma once#define SIZE 1024#define FLUSH_NONE 0
#define FLUSH_LINE 1
#define FLUSH_FULL 2struct IO_FILE
{int flag; // 刷新方式int fileno; // 文件描述符char outbuffer[SIZE];int cap;int size;// TODO
};typedef struct IO_FILE mFILE;mFILE *mfopen(const char *filename, const char *mode);
int mfwrite(const void *ptr, int num, mFILE *stream);
void mfflush(mFILE *stream);
void mfclose(mFILE *stream);
my_strinng.c:
#include "my_string.h"int my_strlen(const char *s)
{const char *end = s;while(*end != '\0')end++;return end - s;
}
my_string.h:
#pragma onceint my_strlen(const char *s);
对.c
文件进行编译:
gcc -c *.c
创建静态库:
ar -rc lib库名字.a.版本号
必须是以lib
开头.a
结尾,后面的版本号可以写可以不写:
将头文件拷贝到系统的头文件里,将新建的静态库拷贝到系统的静态库里:
接下来在另一个目录里面尝试使用我们所导入的静态库:
#include <my_stdio.h>
#include <my_string.h>
#include <stdio.h>int main()
{char *str = "hello";int len = my_strlen(str);printf("len: %d\n", len);mFILE *fp = mfopen("log.txt", "a");if(fp == NULL) return 1;mfwrite(str, len, fp);mfclose(fp);return 0;
}
发现链接报错!报错信息显示并不认识所用的函数,这是为什么?
首先,在lib64/
里面并不只有一个库,编译器怎么知道你用的是哪一个库
这不对吧,那为什么我们平时用gcc的时候并不需要告诉编译器要用哪个库呢?
那是因为gcc是C语言编译,肯定是要认识C标准库的啊
所以我们要告诉编译器要用哪个库,无论你怎么操作,你都只是第三方库:
gcc test.c -llibmystdio.a
怎么还是不行?我已经告诉他了啊,那是因为告诉错了,库的名字是要去掉前缀和后缀:
gcc test.c -lmystdio
方法二:和源文件在一起
懂了吗?要是在目录中已经提供了.h
和静态库
该怎那么使用呢?首先就是吧头文件改回""
:
#include "my_stdio.h"
#include "my_string.h"
#include <stdio.h>int main()
{char *str = "hello";int len = my_strlen(str);printf("len: %d\n", len);mFILE *fp = mfopen("log.txt", "a");if(fp == NULL) return 1;mfwrite(str, len, fp);mfclose(fp);return 0;
}
gcc test.c -lmystdio
竟然发现找不到库?明明已经在当前目录了啊,这就说明编译器在查找库的时候,并不会在当前目录下查找,所以引入另一个选项-L
:
gcc test.c -L. -lmystdio
在-L
之后指明路径,告诉编译器不仅要在系统库里查找,还要在我知名的路径下查找,在这里我写的是.
,表示当前目录下
方法三:使用带路径的库
Makefile:
libmystdio.a:my_stdio.o my_string.oar -rc $@ $^
%.o:%.cgcc -c $<
.PHONY:clean
clean:rm -rf *.a *.o output
.PHONY:output
output:mkdir -p stdc/includemkdir -p stdc/libcp -f *.h stdc/includecp -f *.a stdc/lib
把弄好的库和头文件全部打包在stdc
里:
对于这种情况,我们该怎么使用库?其实很简单,首先就是告诉编译器头文件在哪里:
-I std/include //可以有空格
-Istd/include //也可以无空格
然后就是告诉编译器库在哪里:
-L std/lib //可以有空格
-Lstd/lib //也可以无空格
最后就是告诉编译器哪一个库:
-lmystdio
总结:
gcc -o test test.c -Istdc/include -Lstdc/lib -lmystdio
动态库
怎么形成动态库:
gcc -o lib动态库.so 依赖文件 -shared // -shared就是告诉编译器不是形成可执行文件,是形成动态库
Makefile
libmystdio.so:my_stdio.o my_string.ogcc -o $@ $^ -shared
%.o:%.cgcc -fPIC -c $<
.PHONY:clean
clean:rm -rf *.so *.o stdc*
对于动态库,在.c
文件编译成.o
文件时要多加一个选项-fPIC
,意思是形成与位置无关码(后续讲动态库链接时解释)
方法一:把动态库安装到系统中
导入库中:
sudo cp *.so /usr/lib/
我们可以通过ldd
指令来查看该可执行程序所依赖的库:
ldd ./a.out
即使形成了可执行文件,动态库也不能删除,删了就跑不动了
方法二:和源文件在一起
操作和静态库一样,但是
他找不到?先继续看方法三:
方法三:使用带路径的库
和静态库方法一样,但是
还是找不到?
解决问题
第一个方法:在Ubuntu下,系统查找动态库是在/lib
下查找的,所以要让我们的动态库加载到/lib
目录下,这个工作很简单,可以直接拷贝:
sudo cp ./libmystdio.so /lib/
第二个方法:直接在/lib
目录下创建软链接与我们的动态库进行链接就行了:
sudo ln -s /home/Sherry/linux_learn/23_day/so/libmystdio.so /lib/libmystdio.so
一定要注意:软链接一定要与动态库同名
此时就可以执行了
第三个方法:导入环境变量
有没有想过为什么系统自身的动态库不需要进行这么复杂的操作?那是因为系统会默认去环境变量查找动态库,这个环境变量叫做:
LD_LIBRARY_PATH
一般没有配置过文件的是没有的,我们可以自行导入环境变量:
export LD_LIBRARY_PATH=LD_LIBRARY_PATH:/home/Sherry/linux_learn/23_day/so
同时提供动静态库,系统会选择哪一个?
同时提供动静态库,系统会默认选择动态库,若要想使用静态库,就要带上:
-static
要注意:如果你强制要使用静态链接,那么就必须提供静态库!
要是你没有提供动态库,只有静态库,用了动态链接,那么gcc、g++
都没得选,只能针对你提供的静态库局部性采用静态链接,程序也可以跑
原理上理解动态库
动态库其实也是个文件,存放在磁盘中,要是有程序使用到这个动态库,就要将动态库加载到内存里
一个程序对应一个主进程,在进程里有对应的虚拟内存,虚拟内存依赖页表来与内存进行映射关系,当磁盘中的动态库加载到内存中后,虚拟内存里的共享区就会通过页表产生映射关系,这样程序就可以找到动态库
当然,一个动态库并非只服务于一个程序,可以是上百个程序,然而动态库已经加载到内存里,所以,只需要虚拟内存通过页表产生映射关系即可,无需再次加载动态库,大大节省了空间,也就是为什么,动态库也被称为共享库,也就是为什么,优先使用动态库
你学会了吗?
好啦,本章对于《Linux:软硬链接和动静态库》的学习就先到这里,如果有什么问题,还请指教指教,希望本篇文章能够对你有所帮助,我们下一篇见!!!
如你喜欢,点点赞就是对我的支持,感谢感谢!!!
相关文章:
Linux:软硬链接和动静态库
hello,各位小伙伴,本篇文章跟大家一起学习《Linux:软硬链接和动静态库》,感谢大家对我上一篇的支持,如有什么问题,还请多多指教 ! 如果本篇文章对你有帮助,还请各位点点赞࿰…...
C# 比较两个List集合内容是否相同
在 C# 中,要比较两个 List<T> 集合的内容是否相同,可以通过以下几种方法: 一、非自定义类的元素比较 1. 使用 SequenceEqual 方法(顺序和内容都相等) 顺序和内容都相等:使用 SequenceEqual。 usin…...
IDEA中Resolving Maven dependencies卡着不动解决方案
一、修改settings.xml Maven配置阿里云仓库主要通过修改Maven的settings.xml文件来实现。以下是具体步骤: 1、找到settings.xml文件: 通常位于Maven安装目录下的conf文件夹中,或者在用户目录下的.m2文件夹中(如果用户自定义了settings.xml的位置)。 2、编辑se…...
重生之我要当云原生大师(十一)访问Linux文件系统
目录 一、解释下文件系统、块设备、挂载点、逻辑卷。 二、简述文件系统、块设备、挂载点、逻辑卷之间的关系? 三、如何检查文件系统? 四、挂载和卸载文件系统的流程? 五、find命令都可以根据什么查找文件。 一、解释下文件系统、块设备、…...
驱动开发系列34 - Linux Graphics Intel 动态显存技术的实现
一:概述 动态显存技术(Dynamic Video Memory Technology, DVMT)是一种由 Intel 提出的内存分配技术,主要用于整合显卡(集成显卡)系统中,以便动态地调整显存大小,从而在不同的负载场景下优化内存使用和系统性能。 动态显存技术的核心在于共享系统内存。集成显卡没有独立…...
feign 远程调用详解
在平常的开发工作中,我们经常需要跟其他系统交互,比如调用用户系统的用户信息接口、调用支付系统的支付接口等。那么,我们应该通过什么方式进行系统之间的交互呢?今天,简单来总结下 feign 的用法。 1:引入依…...
HTML5 应用程序缓存
HTML5 应用程序缓存 引言 随着互联网技术的飞速发展,移动设备的普及,用户对于网页的加载速度和离线访问的需求日益增长。HTML5 应用程序缓存(Application Cache,简称AppCache)应运而生,它允许开发者将网页资源存储在本地,从而实现网页的快速加载和离线访问。本文将详细…...
7.PPT:“中国梦”学习实践活动【20】
目录 NO1234 NO5678 NO9\10\11 NO1234 考生文件夹下创建一个名为“PPT.pptx”的新演示文稿Word素材文档的文字:复制/挪动→“PPT.pptx”的新演示文稿(蓝色、黑色、红色) 视图→幻灯片母版→重命名:“中国梦母版1”→背景样…...
利用NestJS构建高效的RESTful API接口
1. 引言 项目背景与目标 随着互联网应用的快速发展,RESTful API已成为前后端分离架构中的重要组成部分。本文将介绍如何使用NestJS构建一个高效且可维护的RESTful API接口。目标是通过NestJS的模块化和依赖注入特性,实现一个易于扩展和维护的API系统。 RESTful API的重要性…...
YOLOv11实时目标检测 | 摄像头视频图片文件检测
在上篇文章中YOLO11环境部署 || 从检测到训练https://blog.csdn.net/2301_79442295/article/details/145414103#comments_36164492,我们详细探讨了YOLO11的部署以及推理训练,但是评论区的观众老爷就说了:“博主博主,你这个只能推理…...
Spring基于文心一言API使用的大模型
有时做项目我们可能会遇到要在项目中对接AI大模型 本篇文章是对使用文心一言大模型的使用总结 前置任务 在百度智能云开放平台中注册成为开发者 百度智能云开放平台 进入百度智能云官网进行登录,点击立即体验 点击千帆大模型平台 向下滑动,进入到模型…...
目前推荐的优秀编程学习网站与资源平台,涵盖不同学习方式和受众需求
一、综合教程与互动学习平台 菜鸟教程 特点:适合零基础新手,提供免费编程语言教程(Python、Java、C/C++、前端等),页面简洁且包含大量代码示例,支持快速上手。适用人群:编程入门者、需要快速查阅语法基础的学习者。W3Schools 特点:专注于Web开发技术(HTML、CSS、JavaS…...
kafka 3.5.0 raft协议安装
前言 最近做项目,需要使用kafka进行通信,且只能使用kafka,笔者没有测试集群,就自己搭建了kafka集群,实际上笔者在很早之前就搭建了,因为当时还是zookeeper(简称ZK)注册元数据&#…...
正则表达式的简单介绍 + regex_match使用
正则表达式 正则表达式(Regular Expression,简称 regex)是一种用于匹配字符串的模式。它由一系列字符和特殊符号组成,用于描述、匹配一系列符合某个句法规则的字符串。正则表达式广泛应用于文本搜索、替换、验证等场景。 它的主…...
kafka服务端之延时操作前传--时间轮
文章目录 背景时间轮层级时间轮时间轮降级kafka中的时间轮kafka如何进行时间轮运行 背景 Kafka中存在大量的延时操作,比如延时生产、延时拉取和延时删除等。Kafka并没有使用JDK自带的Timer或DelayQueue来实现延时的功能,而是基于时间轮的概念自定义实现…...
鸿蒙harmony 手势密码
1.效果图 2.设置手势页面代码 /*** 手势密码设置页面*/ Entry Component struct SettingGesturePage {/*** PatternLock组件控制器*/private patternLockController: PatternLockController new PatternLockController()/*** 用来保存提示文本信息*/State message: string …...
如何修复WordPress连接超时显示curl-error-28的错误
许多WordPress用户都会遇到这样的问题:网站加载变慢或数据传输失败,后台提示‘cURL错误28:连接超时’。这其实是一个常见的问题,通常是由于数据传输时间过长造成的。虽然这个错误听起来复杂,但解决起来并不算困难。本文…...
CSS 相关知识
1、高度已知,三栏布局,左右宽度 200,中间自适应,如何实现? <body><div class"box"><div class"box1">高度已知</div><div class"box2">左右宽度 200&…...
Django开发入门 – 0.Django基本介绍
Django开发入门 – 0.Django基本介绍 A Brief Introduction to django By JacksonML 1. Django简介 1) 什么是Django? 依据其官网的一段解释: Django is a high-level Python web framework that encourages rapid development and clean, pragmatic design. …...
一步一步生成音乐类小程序的详细指南,结合AI辅助开发的思路
以下是一步一步生成音乐类小程序的详细指南,结合AI辅助开发的思路: 需求分析阶段核心功能梳理 音乐播放器(播放/暂停/进度条/音量)歌单分类(流行/古典/摇滚等)用户系统(登录/收藏/历史记录)搜索功能(歌曲/歌手/专辑)推荐系统(根据用户偏好推荐)技术选型 前端:微信…...
看盘细节系列 篇二:集合竞价的9点18分大单打到3%以下或以上,9点19分撤单
文章目录 系列文章现象原因分析时间点含义正常情况测试市场反应诱导跟风操纵股价意图系列文章 看盘细节系列 篇一:集合竞价尾盘突变 现象 集合竞价中 9 点 18 分通过一笔大单或连续几笔大单将股价打到 3% 以下或以上,9 点 19 分又迅速撤单。从而在分时图上留下一根长长的上…...
【Spring】什么是Spring?
什么是Spring? Spring是一个开源的轻量级框架,是为了简化企业级开发而设计的。我们通常讲的Spring一般指的是Spring Framework。Spring的核心是控制反转(IoC-Inversion of Control)和面向切面编程(AOP-Aspect-Oriented Programming)。这些功能使得开发者…...
【C语言标准库函数】双曲函数:sinh(), cosh(), tanh()
目录 一、头文件 二、函数简介 2.1. 双曲正弦函数 sinh(double x) 2.2. 双曲余弦函数 cosh(double x) 2.3. 双曲正切函数 tanh(double x) 三、函数实现(概念性) 四、注意事项 4.1. 参数类型 4.2. 计算精度 4.3. 函数返回值 4.4. 环境差异 4.…...
Visual Studio(VS)初始配置环境(scanf异常)
发现问题 当我们第一次安装Visual Studio(VS)且没有初次环境配置时,用某些函数时会发现报错异常。(如下scanf函数为例) #include<stdio.h>int main() {int a 0;scanf("%d", &a);printf("%…...
【JVM详解一】类加载过程与内存区域划分
一、简介 1.1 概述 JVM是Java Virtual Machine(Java虚拟机)的缩写,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。由一套字节码指令集、一组寄存器、一个栈、一个垃圾回收堆和一个存储方法域等组成。JVM屏蔽了与操作系统平台相关…...
《图解设计模式》笔记(五)一致性
十一、Composite模式:容器与内容的一致性 像文件夹与文件一样,文件夹中可以放子文件夹与文件,再比如容器中可以放更小的容器和具体内容。 Composite模式:使容器与内容具有一致性,创造出递归结构。 Composite&#x…...
burpsuite抓取html登陆和上传数据包
一、burpsuite抓取html登陆数据包 1、先写一个html格式的登陆页面 <!doctype html> <html lang="en"> <head><meta charset="UTF-8"><title>这是标签</title></head> <body> <hr><!-- 登陆表单…...
前端导出pdf,所见即所得
一、推荐方案:html2canvas jsPDF(图片式PDF) javascript import html2canvas from html2canvas; import jsPDF from jspdf;const exportPDF async (elementId, fileName) > {const element document.getElementById(elementId);// 1.…...
使用orjson库提升Python JSON处理性能
使用orjson库提升Python JSON处理性能 引言 在现代软件开发中,JSON(JavaScript Object Notation)作为一种轻量级的数据交换格式,广泛应用于Web服务、配置文件、数据存储等场景。Python作为一门流行的编程语言,提供了…...
TcpClientTest
ClientTest: using System; using System.Net.Sockets; using System.Text;class TcpClientTest {static void Main(string[] args){try{// 创建一个TcpClient实例并连接到服务器 TcpClient client new TcpClient("1vg5062570.51mypc.cn", 43319);//1v…...
【系统架构设计师】操作系统 ② ( 存储管理 | 页式存储 | 逻辑地址 与 物理地址 | 页表结构 | 物理内存淘汰机制 )
文章目录 一、页式存储1、CPU 调用数据2、内存存储数据弊端3、分页存储4、逻辑地址 和 物理地址 的结构5、逻辑地址 和 物理地址 的结构 示例6、页式存储 优缺点 二、逻辑地址 与 物理地址1、逻辑地址2、物理地址3、逻辑地址 与 物理地址 区别4、逻辑地址 与 物理地址 的转换 三…...
STM32自学记录(八)
STM32自学记录 文章目录 STM32自学记录前言一、ADC杂记二、实验1.学习视频2.复现代码 总结 前言 ADC 一、ADC杂记 ADC其实就是一个电压表,把引脚的电压值测出来,放在一个变量里。 ADC:模拟——数字转换器。 ADC可以将引脚上连续变化的模拟电…...
Vim 多窗口编辑及文件对比
水平分割 :split 默认使用水平分割的方式。 :split :sp 垂直分割 :vsplit :vs 带文件的分割 :split 文件名 :sp 文件名 在光标所在的窗口,输入分割窗口命令就会对那个窗口进行分割。 切换窗口 Ctrlw 切换正在编辑的窗口 快速分割窗口 Ctrlwn 快速分割当前…...
基于深度学习的人工智能量化衰老模型构建与全流程应用研究
一、引言 1.1 研究背景与意义 1.1.1 人口老龄化现状与挑战 人口老龄化是当今全球面临的重要社会趋势之一,其发展态势迅猛且影响深远。根据联合国的相关数据,1980 年,全球 65 岁及以上人口数量仅为 2.6 亿,到 2021 年,这一数字已翻番,达到 7.61 亿,而预计到 2050 年,…...
第八届大数据与应用统计国际学术研讨会(ISBDAS 2025)
重要信息 官网:www.is-bdas.org 时间:2025年2月28-3月2日 地点:中国 广州 主办单位:广东省高等教育学会人工智能与高等教育研究分会 协办单位:北京师范大学人工智能与未来网络研究院、人工智能与大数据科研基地 …...
链表专题-03
链表专题(三) 两数相加 问题 [力扣2] 2. 两数相加 - 力扣(LeetCode) 问题描述 给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。请你将两个数相加ÿ…...
Ollama下载安装教程
一、去官网下载Ollama 点击前往Ollama官网 进去后点击下载 根据不同的系统去选择 由于服务器在国外可能下载界面进不去或者下载非常慢,可以去网盘获取 点击下方蓝色字体直达 点击前往夸克网盘下载 点击前往百度网盘下载 下载好后双击应用程序安装即可 点击ins…...
SQL Server查询计划操作符(7.3)——查询计划相关操作符(6)
7.3. 查询计划相关操作符 48)Key Lookup:该操作符对一个有簇索引的表进行书签查找。参数列包含簇索引的名字和用于查找簇索引中数据行的簇键。该操作符总是伴随一个Nested Loops操作符。如果其参数列中出现WITH PREFETCH子句,则查询处理器已决定使用异步预取(预读,read-ah…...
IDEA查看项目依赖包及其版本
一.IDEA将现有项目转换为Maven项目 在IntelliJ IDEA中,将现有项目转换为Maven项目是一个常见的需求,可以通过几种不同的方法来实现。Maven是一个强大的构建工具,它可以帮助自动化项目的构建过程,管理依赖关系,以及其他许多方面。 添加Maven支持 如果你的项目还没有pom.xm…...
网络分析工具—WireShark的安装及使用
Wireshark 是一个广泛使用的网络协议分析工具,常被网络管理员、开发人员和安全专家用来捕获和分析网络数据包。它支持多种网络协议,能够帮助用户深入理解网络流量、诊断网络问题以及进行安全分析。 Wireshark 的主要功能 数据包捕获与分析: …...
【LeetCode 刷题】贪心算法(2)-进阶
此博客为《代码随想录》贪心算法章节的学习笔记,主要内容为贪心算法进阶的相关题目解析。 文章目录 135. 分发糖果406. 根据身高重建队列134. 加油站968. 监控二叉树 135. 分发糖果 题目链接 class Solution:def candy(self, ratings: List[int]) -> int:n l…...
网络工程师 (25)OSI模型—服务访问点
前言 OSI模型,即开放式通信系统互联参考模型(Open System Interconnection Reference Model),是国际标准化组织(ISO)提出的一个旨在使各种计算机在世界范围内互连为网络的标准框架。 一、定义 服务访问点&a…...
如何在RTACAR中配置IP多播(IP Multicast)
一、什么是IP多播 IP多播(IP Multicast)是一种允许数据包从单一源地址发送到多个目标地址的技术,是一种高效的数据传输方式。 多播地址是专门用于多播通信的IP地址,范围从 224.0.0.0到239.255.255.255 与单播IP地址不同&#x…...
使用docker搭建FastDFS文件服务
1.拉取镜像 docker pull registry.cn-hangzhou.aliyuncs.com/qiluo-images/fastdfs:latest2.使用docker镜像构建tracker容器(跟踪服务器,起到调度的作用) docker run -dti --networkhost --name tracker -v /data/fdfs/tracker:/var/fdfs -…...
VC播放mp3的方法
1、使用msi库 #include <mmsystem.h> #pragma comment(lib,"winmm.lib") .......//打开文件MCI_OPEN_PARMS mciOpen; mciOpen.lpstrDeviceType _T("mpegvideo"); mciOpen.lpstrElementName _T("c://1.mp3"); MCIERROR mciError mci…...
【读书笔记·VLSI电路设计方法解密】问题46:什么是bug覆盖率
在IC设计项目的验证过程中,功能测试(通过使用测试平台)有助于定位设计错误或漏洞。这个验证过程有三个阶段:构建和启动测试平台、验证基本测试用例以及验证边界情况。 在前两个阶段,漏洞很容易被检测到,因…...
sqli-lab靶场学习(五)——Less15-17(post方法盲注、修改密码)
前言 第11-14关开始用post方法,15-17关会用到盲注,post方法盲注和get方法类似。 Less15 这关是单引号闭合,有报错但没有具体情况的回显,因此适合使用错误盲注。 在用户名密码框分别输入 账号:admin and 11 -- asd…...
1、http介绍
一、HTTP 和 HTTPS 简介 HTTP(HyperText Transfer Protocol) 用途:用于网页数据传输(不加密)。协议特性:以明文形式传输数据,默认端口 80,无身份验证和完整性保护。典型场景…...
Vim跳转文件及文件行结束符EOL
跳转文件 gf 从当前窗口打开那个文件的内容,操作方式:让光标停在文件名上,输入gf。 Ctrlo 从打开的文件返回之前的窗口 Ctrlwf 可以在分割的窗口打开跳转的文件,不过在我的实验不是次次都成功。 统一行尾格式 文本文件里存放的…...
LLM:DeepSeek 系列(二)
原文链接 3、DeepSeek-V2 DeepSeek-V2 发布于 2024 年 5 月,为多领域专家(MoE)语言模型,包含总共 2360 亿个参数,其中每个词元激活 210 亿个参数,并支持 12.8 万个词元的上下文长度。DeepSeek-V2 采用包括…...