当前位置: 首页 > news >正文

【Linux】初识信号及信号的产生

初始信号

  • 初始信号
    • 什么是信号
    • 站在应用角度的信号
    • 查看Linux系统定义的信号列表
  • 信号的常见处理方式
  • 信号的产生
    • 通过终端按键产生信号
      • 什么是core dump?
      • 如何开启core dump?
      • core dump有什么用?
      • 为什么默认关闭core dump?
      • 设置了core文件大小但是没有产生core文件的可能原因
    • 通过系统函数向进程发信号
    • 由软件条件产生信号
    • 硬件异常产生信号
      • 一点简单的拓展,有关于键盘产生信号
      • 关于异常产生信号

初始信号

什么是信号

Linux系统提供的让用户(进程)给其他进程发送异步信息的一种方式

  1. 在没有发生的时候,我们已经知道发生的时候,怎么处理了
  2. 我们可以识别各种类型的信号,结合第一条和第二条,我们能识别一个信号并处理(打个比方说,当我们过马路时看到红灯时,我们眼睛看到了红灯信号,然后我们的处理方式通常就是站在马路边上等待)
  3. 信号到来的时候,我们正在处理更重要的事情,我们暂时不能处理到来的信号,我们必须要将到来的信号进行临时保存
  4. 信号到了,可以不立即处理,自己在合适的时候处理
  5. 信号的产生是随时产生的,我们无法准确预料,所以信号是异步发送的(信号的产生,是由别人(用户、进程)产生的,我收到之前,我一直在忙我的事情,并发在运行的)
    将以上的“我”换成进程,就是进程看待信号的方式

站在应用角度的信号

在这里插入图片描述

  • 用户输入指令,在shell下启动一个前台进程
  • 用户按下ctrl+c,键盘输入产生硬件中断,被OS获取,解释成信号,发送给目标前台进程
  • 前台进程因为收到信号,进而引起进程退出
    在这里插入图片描述
    注意:
    1、 ctrl+c 产生的信号只能发送给前台进程,一个命令后面加上&可以将其放到后台执行,这样shell就不必等待该进程结束就可以接受新的命令,启动新的进程
    2.、shell可以同时接受运行一个前台进程任意多个后台进程,只有前台进程才能接到例如ctrl+c这种控制链产生的信号
    3、 前台进程在运行过程中用户随时可能按下ctrl+c而产生一个信号,也就是说该进程的用户代码空间执行到任何地方都可能因为收到信号而终止或者产生其他行为,所以信号相对于进程的控制流程来说是异步的

查看Linux系统定义的信号列表

在这里插入图片描述

  • 每个信号都有一个编号和一个宏定义名称,比如2号信号就是#define SIGINT 2
  • 编号34以上的是实时信号,这篇博客主要是讨论编号34以下的信号,不讨论实时信号,这些信号各自在什么条件下产生,默认的处理动作是什么,在signal(7)中都有详细的说明:在命令行输入man 7 signal即可查看
    在这里插入图片描述

信号的常见处理方式

常见的信号处理方式有以下三种

  • 忽略此信号
  • 执行该信号的默认处理动作
  • 提供一个信号处理的函数,要求在内核处理信号的时候切换到用户态执行这个处理函数,这种方式称之为捕捉(catch)一个信号

  这里要先介绍一个linux的系统调用signal
在这里插入图片描述
在这里插入图片描述
1、当我们要忽略一个信号时(这里用2号信号为例),就将第二个参数传递SIG_IGN即可
在这里插入图片描述
在这里插入图片描述
2、执行该信号的默认处理动作,2号信号的默认处理动作就是终止当前正在运行的前台进程,这里就不再演示了
3、让该信号执行自定义的动作
在这里插入图片描述
在这里插入图片描述

信号的产生

通过终端按键产生信号

  SIGINT的默认处理动作是终止当前进程,SIGQUIT的默认处理动作是终止进程并Core Dump(之前演示时用到的ctrl+c就是向进程发送2号的方式)
在这里插入图片描述
  进程收到了的大部分信号的动作都是进程自己终止,终止有两种方案,一种叫做core,一种叫做term,它们又什么区别?

什么是core dump?

  首先解释什么是Core Dump。当一个进程要异常终止时,可以选择把进程的用户空间内存数据全部 保存到磁盘上,文件名通常是core,这叫做Core Dump。进程异常终止通常是因为有Bug,比如非法内存访问导致段错误,事后可以用调试器检查core文件以查清错误原因,这叫做Post-mortem Debug(事后调试)。
  一个进程允许产生多大的core文件取决于进程的Resource Limit(这个信息保存 在PCB中)。默认是不允许产生core文件的,因为core文件中可能包含用户密码等敏感信息,不安全。在开发调试阶段可以用ulimit命令改变这个限制,允许产生core文件。 首先用ulimit命令改变Shell进程的Resource Limit,允许core文件最大为1024K
  而term就是不产生任何文件的普通终止行为

如何开启core dump?

  之前已经提到了core dump默认是关闭的,使用命令ulimit -c可以查看相关的信息
在这里插入图片描述
使用ulimit -c可以通过设置文件大小打开core dump功能
在这里插入图片描述

core dump有什么用?

  当一个进程发生了除0异常,如果是term结束,在系统层面上直接不管了,直接把代码和数据还有内核数据结果直接释放掉,这个进程就没了
  但是如果信号除0动作是core,则会将进程在内存中的核心数据(主要是与调试有关)转储到磁盘中形成core、core.pid的文件,这样可以定位到这个进程为什么会退出,以及是执行到哪一行代码退出了
  core其实是一种机制,如果进程在执行过程中出异常了,就将进程在内核中的核心数据转储到磁盘当中以文件的方式保存,这种方式叫做core dump:核心转储
  所以命令ulimit -c其实是在设置core文件的上限大小(默认情况下为0,代表即便是core退出,也不要形成核心转储文件)
  说了这么多,core文件中既然包含了相关的错误信息,我们就可以根据文件中的错误信息进行调试

int main()
{int a=10;a/=0;return 0;
}

  比如这段代码,在代码中产生一个除0异常,然后运行程序
在这里插入图片描述
发现多了一个文件core,这个文件存的就是程序的错误原因
在这里插入图片描述
  大部分信号当中,只要是退出信息(Action)是core,都是可以通过打开core dump功能,事后根据core文件进行定位问题和调试
云服务器默认是将进程以core形式退出,进行了特定的设定,默认core是被关闭的

为什么默认关闭core dump?

  Linux系统是有服务关闭自动重启的功能的,如果服务一异常关闭,然后重启,一关闭又重启…就会留下很多的core文件,时间一长就会导致云服务器的磁盘被占满->防止未知的core dump一直在进行,导致磁盘服务器被打满

设置了core文件大小但是没有产生core文件的可能原因

  我在第一次使用已经设置了core文件的大小但是出现异常时并没有出现core文件,我查了一下,有以下几种说法

  • 程序设置了用户id(即调用setuid),但当前用户并非该程序文件的所有者
  • 程序设置了组id(即调用setgid),但当前用户并非该程序文件的组所有者
  • 用户没有当前目录或指定core文件产生目录的写权限
  • core文件太大,磁盘空间不足
      但是我检查了这几点发现这些都不是原因,后来我了解到,可能是core文件产生的位置有关,core的缺省位置是程序所在目录,可以通过修改/proc/sys/kernel/core_pattern来指定core文件生成位置了名称。
      然后我查看了core_pattern文件,发现文件内容是一段脚本程序,后来查看说明文件,才知道core_pattern中如果首先指定了一个 ‘|’ 管道符,则会将生成的core文件传递给后面所跟的脚本去处理。
    在这里插入图片描述
      至此,也就确定了问题的原因,| 管道符后面的脚本将我们的core文件给吞了,解决方法自然就是去掉这个脚本,换成自己指定的目录
      但直接去修改core_pattern文件并没有成功,保存时会提示FSync错误,查阅资料得知,这个文件有特殊限制,只能通过命令:
sudo bash -c "echo 这里是写入内容 > /proc/sys/kernel/core_pattern "

我使用的是

sudo bash -c "echo core > /proc/sys/kernel/core_pattern "

  来进行写入,即指定程序所在目录为core文件生成目录,core文件名称为"core"。

通过系统函数向进程发信号

在这里插入图片描述
在这里插入图片描述  kill函数是向任意进程发送信号,而raise是向自己发送信号。两个函数的返回都是成功返回0,错误返回-1
在这里插入图片描述
  abort函数的作用是使当前进程接收到信号而异常重者,和kill(getpid(),6)用法有点相似(6号信号是SIGABRT)

由软件条件产生信号

  SIGPIPE就是很典型的由软件条件产生的信号,这个信号是在进程间通信方式之一——管道中,读端已经关闭而写端仍然还在写入时,这个时候系统就会通过向写端发送SIGPIPE信号关闭写端
  还有个信号SIGALRM信号

#include <unistd.h>
unsigned int alarm(unsigned int seconds);

  调用alarm函数可以设定一个闹钟,也就是告诉内核在seconds秒之后给当前进程发SIGALRM信号, 该信号的默认处理动作是终止当前进程。
  这个函数的返回值是0或者是以前设定的闹钟时间还余下的秒数。打个比方,某人要小睡一觉,设定闹钟为30分钟之后响,20分钟后被人吵醒了,还想多睡一会儿,于是重新设定闹钟为15分钟之后响,“以前设定的闹钟时间还余下的时间”就是10分钟。如果seconds值为0,表示取消以前设定的闹钟,函数的返回值仍然是以前设定的闹钟时间还余下的秒数
  但是"闹钟"只能响一次,所以如果要让这个闹钟多次响,需要捕捉SIGARM信号,在处理完信号后,再设置一个闹钟

#include<iostream>
#include<signal.h>int main()
{int cnt=0;alarm(1);while(true){std::cout<<cnt<<std::endl;cnt++;}return 0;
}

  这个代码的作用就是在1秒钟之内不停的数数,1秒种到了因接收到了SIGARM就停止

硬件异常产生信号

  硬件异常被硬件以某种方式被硬件检测到并通知内核,然后内核向当前进程发送适当的信号。例如当前进程执行了除以0的指令,CPU的运算单元会产生异常,内核将这个异常解释 为SIGFPE信号发送给进程。再比如当前进程访问了非法内存地址,MMU会产生异常,内核将这个异常解释为SIGSEGV信号发送给进程。

一点简单的拓展,有关于键盘产生信号

  键盘是一个硬件,作为一个键盘它需要知道以下几点

  1. 按键按下了

  2. 哪些按键按下了

  3. 字符输入(字符设备(键盘都是字符输入)),键盘还可以进行组合键输入(ctrl +c),相当于输入的是命令
      不管你是键盘输入还是组合键输入,在键盘层面上,就是按键,但是到底输入的字符还是命令,这个是由操作系统决定的(键盘和OS联合解释),因为一切皆文件,所以键盘设备也可以看作是操作系统打开的一个文件,所以键盘获取到的数据就会放到键盘的输入缓冲区里,上层就通过0号文件描述符将其读出来
      操作系统怎么知道键盘上面有数据输入?
      要么是操作系统去定期的检测键盘是否有数据被按下,但是这样的话效率就太低了
      其实操作系统时使用了一种硬件中断的技术,当操作系统刚开机的时候,已经形成了一张表,这张表上已经注册了很多对软硬件进行操作的方法
      这个所谓的中断向量表就是函数指针数组。此时的CPU正在执行进程代码。这个中断向量表其实也是属于操作系统的数据
      CPU只和内存打交道,并且CPU内部有很多的针脚(物理性的),这些针脚在主板上是可以和键盘进行连接的(每个针脚都有特定的编号),未来键盘在进行按键的时候会给CPU中特定的针脚触发硬件中断,CPU就知道哪个针脚上面有高电平了就可以识别这个针脚。
      总之,CPU已经知道了有触发的针脚上面已经有高电平了,有因为每个针脚上面又有特定的编号,也就意味着当键盘被按下时会向CPU的2号针脚处发送高电平(也可以把这个2号称之为中断号)。即CPU能识别到

  4. 有高电平

  5. 是几号针脚

  CPU内部还有寄存器,寄存器req就会将中断号存起来(到此,硬件到软件的动作就做完了)
  然后,CPU识别到对应的寄存器中有数字,CPU就直接要求操作系统先暂停当前进程,然后让操作系统拿着中断号去中断向量表去查对应的方法,然后根据中断向量表中对应的方法去执行读取数据的任务。因为中断向量表中的方法都是操作向量表提供的,所以在调用里面的方法的时候,操作系统就能够知道数据到来了并将数据读入内存中
  读到数据之后就要对数据做“判定”,看是字符还是控制命令,如果是字符,就将其放入到缓冲区中让上层读取;如果是控制命令,就将其解释成信号,让后再将这个信号发送给进程(解释信号就是到进程的pcb中将位图上对应的比特位由0置1)
  之前提到,当信号在到来的时候,如果进程正在处理更重要的事情,就会暂时不处理信号,而是将信号进行临时保存,保存在哪里呢?保存在进程的pcb中。一个进程可能会收到多个信号,所以pcb内部就需要对收到的信号进行管理,因为信号的编号是1、2……31,所以pcb中采用的就是位图的方法保存信号

关于异常产生信号

emsp; CPU中有很多寄存器,有些寄存器是用来做计算的,也有些寄存器是用来CPU内部中的管理,其中就有一个寄存器叫做EFLAGS/RFLAGS,这个是标志寄存器,包含了状态和控制标志,其中有一个标志称为CF(这个标志称作为是溢出标志,Overfliow Flag),当CPU内部进行运算

int a=10;
a/=0;

  CPU内部会将10放到一个寄存器中(假设为eax),然后将0放到一个寄存器中(假设为ebx),按照代码就是让eax中数初一abx中的数,然后将结果写回到eax中,但是在运算10除以0的时候,得到的是一个巨大的数字,据发生了溢出,然后溢出标志位设为1,也就是说计算出现了错误(计算错误,表现到了CPU的寄存器上也就是硬件上),此时操作系统识别到了操作系统内部有错误,CPU就不再调度进程了,CPU就告诉操作系统,操作系统发现确实出现了异常,就直接向对应进程的pcb中发送对应的溢出信号(修改对应的位图),至此,就完成了信号的发送

相关文章:

【Linux】初识信号及信号的产生

初始信号 初始信号什么是信号站在应用角度的信号查看Linux系统定义的信号列表 信号的常见处理方式信号的产生通过终端按键产生信号什么是core dump?如何开启core dump?core dump有什么用&#xff1f;为什么默认关闭core dump&#xff1f;设置了core文件大小但是没有产生core文…...

故障诊断 | 基于 KAN、KAN卷积的轴承故障诊断模型

研究背景: 轴承是机械设备中常见的关键部件之一,其工作状态直接影响设备的性能和可靠性。因此,轴承故障的早期诊断对于设备的正常运行和维护具有重要意义。近年来,基于振动信号的轴承故障诊断成为了研究的热点之一。KAN: Kolmogorov-Arnold Network 是一种有效的处理方法。…...

【设计模式】JAVA Design Patterns——Factory Method(虚拟构造器模式)

&#x1f50d;目的 为创建一个对象定义一个接口&#xff0c;但是让子类决定实例化哪个类。工厂方法允许类将实例化延迟到子类 &#x1f50d;解释 真实世界例子 铁匠生产武器。精灵需要精灵武器&#xff0c;而兽人需要兽人武器。根据客户来召唤正确类型的铁匠。 通俗描述 它为类…...

Spring——依赖项

文章目录 依赖注入基于构造函数的依赖注入基于 Setter 的依赖注入依赖解析过程依赖注入的示例 依赖关系和配置详细信息直接值&#xff08;原语、字符串等&#xff09;idref标签References to Other Beans &#xff08;对其他 Bean的引用&#xff09;Inner Beans&#xff08;内部…...

C语言 | Leetcode C语言题解之第119题杨辉三角II

题目&#xff1a; 题解&#xff1a; int* getRow(int rowIndex, int* returnSize) {*returnSize rowIndex 1;int* row malloc(sizeof(int) * (*returnSize));row[0] 1;for (int i 1; i < rowIndex; i) {row[i] 1LL * row[i - 1] * (rowIndex - i 1) / i;}return row…...

深入分析 Android Service (一)

文章目录 深入分析 Android Service (一)1. Android Service 设计说明1.1. Service 的类型1.2. Service 的生命周期1.3. 创建和启动 Service1.4. 绑定 Service1.5. ServiceConnection1.6. 前台 Service1.7. IntentService示例&#xff1a;创建和使用 IntentService 2. Service …...

英飞凌24GHz毫米波雷达-BGT24LTR11N16家用机器人应用

BGT24LTR11N16基础描述&#xff1a; 关于BGT24LTR11N16&#xff0c;它是一款用于信号生成和接收的硅锗雷达MMlC&#xff0c;工作频率为24.00GHz至24.25GHz ISM频段。它基于24GHz基本电压控制振荡器&#xff08;VCO&#xff09;。 这颗芯片是属于1T1R&#xff0c;也就是一发一收…...

17.js字符串

字符串创建 1.字面量创建 var 字符串名字符串 2.内部构造函数创建 var 字符串名new String(字符串) length属性 只能读取不能设置 var strabcdfegfglconsole.log(str.length) //10str.length5 console.log(str) //不能写 abcdfegfgl index属性 只能读不能设置 var strab…...

JS-51-Node.js10-yarn

一、yarn的简介 Yarn 是一款 JavaScript 的包管理工具&#xff08;npm的代替方案&#xff09;&#xff0c;是 Facebook, Google, Exponent 和 Tilde 开发的一款新的 JavaScript 包管理工具。 正如 Yarn 官网的介绍&#xff0c;Yarn 的具有速度快 、安全 、可靠 的优点&#x…...

idea项目一直在build

IDEA项目一直在build的原因可能包括构建进程堆大小过小、缓存问题、依赖包下载缓慢或网络问题。12 构建进程堆大小过小&#xff1a;如果IDEA的构建进程堆大小设置得不够大&#xff0c;可能会导致构建过程缓慢或卡顿。解决方法是将构建进程堆大小参数扩大&#xff0c;例如将700…...

SpringBoot六种API请求参数读取方式

SpringBoot六种API请求参数读取方式 同步请求和异步请求 同步: 指单线程依次做几件事异步: 指多线程同时做几件事 同步请求: 指客户端浏览器只有一个主线程, 此线程负责页面的渲染和发出请求等操作, 如果此主线程发出请求的话则停止渲染而且会清空页面显示的内容 直到服务器响…...

WSDM2024推荐系统和LLM相关论文整理(二)

WSDM 2024接收的论文已经公布&#xff0c;全部收录的论文可前往地址 网址&#xff1a;https://www.wsdm-conference.org/2024/accepted-papers/ 其中推荐系统相关论文三十余篇&#xff0c;下文列举了部分论文的标题以及摘要&#xff0c;更多内容欢迎关注公众号【深度学习推荐算…...

Mybatis 查询TypeHandler使用,转译查询数据(逗号分隔转List)

创建自定义的Hanndler /*** Package: com.datalyg.common.core.handler* ClassName: CommaSeparatedStringTypeHandler* Author: dujiayu* Description: 用于mybatis 解析逗号拼接字符串* Date: 2024/5/29 10:03* Version: 1.0*/ public class CommaSeparatedStringTypeHandle…...

易查分小程序|如何开启个人密钥功能?

一般情况下发布查询&#xff0c;用姓名和手机尾号等作为查询条件就足够了&#xff0c;如果查询需要的私密性要求很高&#xff0c;可以使用易查分的【个人密钥】功能&#xff0c;下面就来教大家如何制作吧。 &#x1f511;个人密钥功能的特点&#xff1a; ✅学生家长可以自主修…...

NoSQL是什么?NoSQL数据库存在SQL注入攻击?

一、NoSQL是什么&#xff1f; NoSQL&#xff08;Not Only SQL&#xff09;是一种非关系型数据库的概念。与传统的关系型数据库不同&#xff0c;NoSQL数据库使用不同的数据模型来存储和检索数据。NOSQL数据库通常更适合处理大规模的非结构化和半结构化数据&#xff0c;且能够…...

成功解决“ImportError: cannot import name ‘mapping‘ from ‘collections‘”错误的全面指南

成功解决“ImportError: cannot import name ‘mapping’ from ‘collections’”错误的全面指南 成功解决“ImportError: cannot import name ‘mapping’ from ‘collections’”错误的全面指南 一、引言 在Python编程中&#xff0c;当我们尝试从某个模块中导入某个名称时&…...

apexcharts数据可视化之圆环柱状图

apexcharts数据可视化之圆环柱状图 有完整配套的Python后端代码。 本教程主要会介绍如下图形绘制方式&#xff1a; 基础圆环柱状图多组数据圆环柱状图图片背景自定义角度渐变半个圆环图虚线圆环图 基础圆环图 import ApexChart from react-apexcharts;export function Cir…...

2024ciscn初赛——easycms

什么是CMS&#xff1f; CMS是“Content Management System”的缩写&#xff0c;意为“内容管理系统”。网站的开发者为了方便&#xff0c;制作了不同种类的CMS&#xff0c;可以加快网站开发的速度和减少开发的成本。 常见的CMS&#xff1a; php类cms系统&#xff1a;dedecms、…...

融合神话传说:构建公共开放平台的技术探索

当今科技发展日新月异的时代&#xff0c;我们越来越意识到跨文化的融合和开放共享的重要性。在这篇博客中&#xff0c;我们将探讨如何利用国外与国内古代神兽和神话故事的灵感&#xff0c;来设计一个创新的公共开放平台。 源自神话的灵感 古代神兽在不同文化中都扮演着重要角色…...

鸿蒙应用Stage模型【应用/组件级配置】

应用/组件级配置 在开发应用时&#xff0c;需要配置应用的一些标签&#xff0c;例如应用的包名、图标等标识特征的属性。本文描述了在开发应用需要配置的一些关键标签。 应用包名配置 应用需要在工程的AppScope目录下的[app.json5配置文件]中配置bundleName标签&#xff0c;…...

css实现圆环展示百分比,根据值动态展示所占比例

代码如下 <view class""><view class"circle-chart"><view v-if"!!num" class"pie-item" :style"{background: conic-gradient(var(--one-color) 0%,#E9E6F1 ${num}%),}"></view><view v-else …...

mongodb源码分析session执行handleRequest命令find过程

mongo/transport/service_state_machine.cpp已经分析startSession创建ASIOSession过程&#xff0c;并且验证connection是否超过限制ASIOSession和connection是循环接受客户端命令&#xff0c;把数据流转换成Message&#xff0c;状态转变流程是&#xff1a;State::Created 》 St…...

【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)

服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...

Java - Mysql数据类型对应

Mysql数据类型java数据类型备注整型INT/INTEGERint / java.lang.Integer–BIGINTlong/java.lang.Long–––浮点型FLOATfloat/java.lang.FloatDOUBLEdouble/java.lang.Double–DECIMAL/NUMERICjava.math.BigDecimal字符串型CHARjava.lang.String固定长度字符串VARCHARjava.lang…...

【AI学习】三、AI算法中的向量

在人工智能&#xff08;AI&#xff09;算法中&#xff0c;向量&#xff08;Vector&#xff09;是一种将现实世界中的数据&#xff08;如图像、文本、音频等&#xff09;转化为计算机可处理的数值型特征表示的工具。它是连接人类认知&#xff08;如语义、视觉特征&#xff09;与…...

从零实现STL哈希容器:unordered_map/unordered_set封装详解

本篇文章是对C学习的STL哈希容器自主实现部分的学习分享 希望也能为你带来些帮助~ 那咱们废话不多说&#xff0c;直接开始吧&#xff01; 一、源码结构分析 1. SGISTL30实现剖析 // hash_set核心结构 template <class Value, class HashFcn, ...> class hash_set {ty…...

Redis数据倾斜问题解决

Redis 数据倾斜问题解析与解决方案 什么是 Redis 数据倾斜 Redis 数据倾斜指的是在 Redis 集群中&#xff0c;部分节点存储的数据量或访问量远高于其他节点&#xff0c;导致这些节点负载过高&#xff0c;影响整体性能。 数据倾斜的主要表现 部分节点内存使用率远高于其他节…...

【Oracle】分区表

个人主页&#xff1a;Guiat 归属专栏&#xff1a;Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...

Maven 概述、安装、配置、仓库、私服详解

目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...

FFmpeg:Windows系统小白安装及其使用

一、安装 1.访问官网 Download FFmpeg 2.点击版本目录 3.选择版本点击安装 注意这里选择的是【release buids】&#xff0c;注意左上角标题 例如我安装在目录 F:\FFmpeg 4.解压 5.添加环境变量 把你解压后的bin目录&#xff08;即exe所在文件夹&#xff09;加入系统变量…...