Linux进程控制
进程控制
- 进程创建
- 系统调用fork()
- fork()的认识
- 进程终止
- 进程等待
- wait/waitpid方法
- 使用 wait/waitpid() 回收子进程
- 进程程序替换
- 程序替换原理
- exec*进程替换函数
进程创建
系统调用fork()
fork():一个:Linux系统中的系统调用,用于创建子进程。
#include <sys/types.h>
#include <unsitd.h>pid_t fork(void);
fork()函数的返回值:
- 父进程: 返回子进程的PID,这是一个大于0的整数。(调用这个系统调用的进程就是父进程)
- 子进程:新创建的子进程内返回0。
- 错误情况:fork() 调用失败,返回-1,并且设置 errno 指示错误原因。
fork() 的特点:
- 复制:子进程是父进程的一个副本,包括代码段、数据段、堆和栈等。
- 独立性:子进程有自己的地址空间,但是初始时这个地址空间与父进程相同。
- 进程ID:子进程获得一个新的、唯一的进程ID。
- 文件描述符:子进程继承父进程的文件描述符,但是它们是独立的文件表条目,所以对文件描述符的任何操作都不会影响另一个进程。
- 信号处理:子进程继承父进程的信号处理设置。
- 终止:子进程通过调用 exit() 函数来结束自己的执行,父进程可以通过 wait() 或 waitpid() 系统调用来等待子进程结束。
fork()的认识
1、为什么fork要给子进程返回0,给父进程返回子进程pid?
答:返回不同的返回值是为了后续的代码可以区分原程序和fork生成的子进程执行的程序,即:为了让两个的执行流执行不同的代码块。
2、fork函数干了什么?
答:fork函数内创建了一个子进程,也就是:让CPU新建了一个子进程的task_struct,填充进子进程的信息,再让这个子进程与原程序共享fork后面的代码,等等。
3、一个函数如何做到返回两次?
答:调用fork()时,内核会创建一个新的进程,原程序的进程和fork产生的子进程是执行同一份代码不同选择路径的两个程序(走了不同的if语句),原程序的fork()会返回子进程的PID,子进程程序中的fork()则返回0。
4、fork返回时只有一个变量存储返回值,而fork有两个返回值,一个变量怎么会存储不同的内容?
答:进程运行时,具有独立性。一开始子进程未修改数据时,代码和数据都是共享的,当父/子进程准备对某个数据进行修改时,系统会为子进程重新开辟一份空间,将要修改的数据拷贝过去,实现数据分离。(数据层面的写时拷贝)
进程终止
进程常见的退出方法:
正常终止(可以通过 echo $? 查看进程退出码):
- main函数的return退出
- 调用_exit()系统调用
- 使用exit()函数
return退出:
return是一种更常见的退出进程方法。执行 ‘return n’ 等同于执行exit(n),因为main函数的返回值会被当做 exit() 的参数。
_exit系统调用:
Linux系统中的系统调用,用来直接终止当前进程。
#include <unistd.h>void _exit(int status);//参数status(退出码):一个整数,表示进程的终止状态,父进程通过wait获取该值。
//0表示程序成功执行并正常退出,而 非0 值表示程序由于某种原因异常终止。
exit函数:
C语言标准库中的一个函数,用于终止当前执行的程序,是对 _exit() 系统调用的封装。
#include <stdlib.h>void exit(int status);
调用exit函数的执行过程:
1.执行 用户通过atexit或on_exit定义的清理函数
2.关闭所有打开的流,所有的缓存数据均被写入
3.调用_exit
进程等待
wait/waitpid方法
wait() 函数:
#include<sys/types.h>
#include<sys/wait.h>pid_t wait(int* status);//返回值:成功返回被等待进程的pid,失败返回-1。
//参数:输出型参数,获取子进程退出状态,不关心则可以设置成为NULL
waitpid() 系统调用:
#include<sys/types.h>
#include<sys/wait.h>pid_t waitpid(pid_t pid,int*status, int options);
返回值:
成功,waitpid()返回收集到的子进程的进程ID;
如果设置了选项 WNOHANG,而调用中waitpid发现没有已退出的子进程可收集,则返回0;
如果调用中出错,则返回-1,并设置errno.
参数:
pid:
pid=-1,等待任意一个子进程,与wait等效;
pid>0,等待其进程ID与pid相等的子进程。
status :
WIFEXITED(status):子进程返回的状态若为正常终止,则为真(查看进程是否是正常退出)
WEXITSTATUS(status):若WIFEXITED非零,提取子进程退出码。(查看进程的退出码)
options:
WNOHANG:若pid指定的子进程没有结束,则waitpid()函数返回0,不予以等待。若正常结束,则返回该子进程的ID。
//wait和waitpid,都有一个status参数,该参数是一个输出型参数,由操作系统填充。int status = 0;
pid_t ret = waitpid(-1,&status,0);
我们使用waitpid时只需要创建一个叫status的变量即可,使用waitpid()时传其地址,操作系统就会自动将子进程的返回状态填入,进而带出。
输出后的status的结构:
进程结束(或异常终止)会调用exit() 返回退出码(或返回终止信号),退出码(或终止信号)会被父进程的waitpid()获取(若子进程变为僵尸进程会对其进行回收),填入status中。
status在正常终止时高八位表示退出状态,异常终止时低七位表示终止信号,第八位是一个core dump标志;通过status,父进程也就获取到了子进程的退出信息。
(core dump 指的是 核心转储,它是操作系统在进程收到某些信号而终止运行时,将此时进程地址空间的内容以及有关进程状态的其他信息写出的一个磁盘文件。)
使用 wait/waitpid() 回收子进程
子进程退出后,若没有父进程回收子进程的资源,子进程会变成僵尸进程,造成内存泄露。
原理:子进程执行完毕(或异常终止)退出会释放内存中的代码数据等资源,但PCB不会释放,此时父进程可以通过 wait/waitpid() 来接收子进程PCB中的退出信息signalcode、exitcode,然后将信息传输到上层,达到回收子进程的目的。
如果子进程不退出(一直保持R/S状态之类的,不进入Z状态),wait/waitpid()会一直等待,父进程也就进入了阻塞状态。
options选项用于设置父进程等待的方式,两种常见的等待方式:
options=0,普通的阻塞等待,父进程被链入子进程的等待队列中,一直单纯的等待;
options=WNOHANG,父进程进行非阻塞轮询(询问进程状态,得知未就绪后立即返回,过一段时间后再次询问,以此循环)并在轮询间隙,父进程可以处理其他任务(轮询等待子进程才是主要任务,所以轮询间隙父进程处理的都是执行时间短、重要性不高的轻量任务)。
ret_pid > 0:等待成功
ret_pid = 0:等待的条件未就绪
ret_pid < 0:等待失败
进程程序替换
程序替换原理
简单展示:
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>int main()
{printf("before: I am a process, pid: %d, ppid:%d\n", getpid(), getppid());// 这类方法的标准写法execl("/usr/bin/ls","ls","-a","-l",NULL); //execl函数后面的代码就被"ls -a-l" 给替换了 printf("after: I am a process, pid: %d, ppid:%d\n", getpid(), getppid());return 0:
}
execl()前面的代码执行了,后面的代码没有执行,反而执行了execl()内的文件。
理解替换原理:
执行mycommand文件形成进程,创建PCB,进程正常执行execl()前的代码,mycommand的代码和数据被从磁盘导入物理内存,该进程的虚拟地址空间通过页表与之映射起来。
执行到execl()后,execl会用ls指令的文件内容/代码和数据替换物理内存中mycommand程序中execl()后的代码和数据,然后页表内容修改,建立起新的页表映射关系,进程继续运行也就变成了执行ls指令。
用fork创建的子进程执行的是和父进程相同的程序(但有可能执行不同的代码分支),子进程往往要调用一种exec函数以执行另一个程序。当进程调用exec函数时,该进程的用户空间代码和数据就会被新程序替换,从新程序的启动例程开始执行。调用exec函数并不创建新进程,所以调用exec函数前后该进程的pid并未改变。
exec*进程替换函数
exec*函数承担的是一个加载器的作用,把磁盘中的代码和数据加载到内存,同时也可以把参数中的arg/argv[] 传递给新加载的程序。
//六大进程替换函数
#include <unistd.h>int execl(const char *path, const char *arg,...);
int execlp(const char *file, const char *arg,...);
int execle(const char *path, const char *arg, ...,char *const envp[]);
int execv(const char *path, char *const argv[]);
int execvp(const char *file, char *const argv[]);
int execvpe(const char *file, char *const argv[], char *const envp[]);//这些函数如果调用成功则加载新的程序从启动代码开始执行, 不再返回。
//如果调用出错则返回-1, 所以exec*函数只有出错的返回值而没有成功的返回值。
//系统调用
int execve(const char *path, char *const argv[], char *const envp);//上面的六个库函数都是对 系统调用execve 的封装
() 内的 … 代表 可变参数列表,指函数或方法可以接受任意数量的参数,只要在最后一个参数后面加上NULL,表示列表结束即可。
执行一个的程序的第一件事是什么?
先找到这个程序,所以exec*函数的第一个参数是待执行程序的路径或所处文件。
execl函数:
execl("/usr/bin/ls", "ls", "-a", "-l", NULL);//最后一个参数用NULL结尾,表示参数已给完,可变参数列表结束。
execlp函数:
以p (PATH) 结尾,表示函数会自动从环境变量的路径变量中查找所要执行的文件,所以给出文件名即可。
execlp("ls", "ls", "-a", "-l", NULL);
第一个参数表示想要执行的程序,后面的参数表示执行方式
即:第一个ls表示想要执行ls命令,后面的”ls”, “-a”, “-l”表示要以 ls -a-l 的方式执行,NULL表示结束 (需要程序所处路径写在环境变量中)。
execv函数:
没有可变参数列表,改用字符串指针数组来传递执行操纵 。
char* const myargv[] = {"ls", "-a", "-l", NULL};
execv("/usr/bin/ls", myargv);
execvp函数:
execvp("ls", myargv);
execle函数:
e -> 环境变量,extern char** environ
创建子进程时,子进程会继承父进程的环境变量,程序替换中环境变量信息不会被替换。
extern char** environ;
execle("/usr/bin/ls", "ls", "-a", "-l", NULL, environ);//传递自己设置的环境变量:
char* const myenv[] = {"MYVAL=111", "MYPATH=/home/yfyf", NULL};
execle("./otherExe", "otherExe", "-a", "-w", NULL, myenv);//传递自己设置的环境变量,这些环境变量会覆盖该进程的环境变量,并不是追加
//otherExe 是自己写的一个可执行文件,同样可用于程序替换
相关文章:
Linux进程控制
进程控制 进程创建系统调用fork()fork()的认识 进程终止进程等待wait/waitpid方法使用 wait/waitpid() 回收子进程 进程程序替换程序替换原理exec*进程替换函数 进程创建 系统调用fork() fork():一个:Linux系统中的系统调用,用于创建子进程…...
分库分表之后,id 主键如何处理?
面试题 分库分表之后,id 主键如何处理? 面试官心理分析 其实这是分库分表之后你必然要面对的一个问题,就是 id 咋生成?因为要是分成多个表之后,每个表都是从 1 开始累加,那肯定不对啊,需要一…...
矩阵简单问题(Java)
问题: 顺时针打印二维方阵: 1 2 3 4 15 5 6 7 8 14 9 10 11 12 13 13 14 15 16 public class Test1 {public static void main(String[] args) {int[][] arr new int[][]{{1, 2, 3, 4,100},{5, 6, 7, 8,101},{9, 10, 11, 12,102},{13, 14, 15, 16,…...
从0到1:构建全新一代分布式数据架构
从0到1:构建全新一代分布式数据架构 一、分布式数据架构概述 1.1 分布式数据架构的定义 分布式数据架构是指将数据分散存储在多个物理或逻辑位置的计算节点上,并通过计算机网络进行协同工作的系统。这种架构能够提供高可用性、可扩展性和容错性&#…...
OpenGL ES 04 图片数据是怎么写入到对应纹理单元的
从指定路径加载图像并转换为 CGImage。获取图像的宽度和高度。创建一个 RGB 颜色空间。为图像数据分配内存。创建一个位图上下文并将图像绘制到上下文中。创建一个新的纹理对象并绑定到指定的纹理单元。指定二维纹理图像。释放分配的内存。设置纹理参数,包括放大和缩…...
uniapp小程序使用rich-text富文本图片溢出问题
参考https://blog.csdn.net/chenny_/article/details/115534622, 看了很多文章,就这个好使,所以记录一下 在common下新建relpaceImg.js // 正则变量 var graceRichTextReg;// 批量替换的样式 [ 根据项目需求自行设置 ] var GRT [// div 样式[div, &qu…...
详解GPT-信息抽取任务 (GPT-3 FAMILY LARGE LANGUAGE MODELS)
GPT-3 FAMILY LARGE LANGUAGE MODELS Information Extraction 自然语言处理信息提取任务(NLP-IE):从非结构化文本数据中提取结构化数据,例如提取实体、关系和事件 [164]。将非结构化文本数据转换为结构化数据可以实现高效的数据处…...
网络基础入门到深入(3):网络协议-HTTP/S
目录 一、HTTP和HTTPS协议简介 1.HTTP协议 .HTTP 协议 作用: 特点: 2.HTTPS协议 作用: 实现方式: 特点: 二.HTTP的请求与响应结构 1.HTTP请求结构 1.请求行:描述操作和资源 2.请求头: 3.请求体 : 2.HTTP…...
Dokcer部署双主Mysql
创建容器: Mysql主1 docker run -d \ --name mysql-master1 \ -e MYSQL_ROOT_PASSWORD123456 \ -v /etc/mysql:/var/lib/mysql \ -p 3306:3306 \mysql:8.01 \ --server-id1 \ --log-binmysql-bin \ --gtid-modeON \ --enforce-gtid-consistencyONMysql主2 docker…...
axios拦截器底层实现原理
Axios 的拦截器通过内部的Promise 链实现了对请求和响应的拦截与修改。了解其底层原理需要深入到 Axios 源码中,特别是其请求发起和响应处理的逻辑。 Axios 拦截器实现流程 拦截器队列 Axios 在内部维护了两个拦截器队列:request 和 response。当开发者…...
《类和对象:基础原理全解析(下篇)》
目录 一、类的构造函数的初始化列表1. 初始化列表的使用2. 初始化列表的初始化顺序3. 使用初始化列表的注意事项 二、类的自动类型转换1. 类的自动类型转换的使用2. 关闭类的自动类型转换 三、静态类成员1. 静态成员的特性2. 使用静态成员计算类创建了多少个对象3. 使用静态类成…...
==和===的区别,被坑的一天
在 JavaScript 中, 和 都用于比较两个值,但它们有一个重要的区别: 1. (宽松相等运算符) 进行比较时,会 自动类型转换(也叫做强制类型转换),即如果比较的两个值的类型不同,JavaScr…...
Azure Airflow 中配置错误可能会使整个集群受到攻击
网络安全研究人员在 Microsoft 的 Azure 数据工厂 Apache Airflow 中发现了三个安全漏洞,如果成功利用这些漏洞,攻击者可能会获得执行各种隐蔽操作的能力,包括数据泄露和恶意软件部署。 “利用这些漏洞可能允许攻击者以影子管理员的身份获得…...
【数据结构】链表(2):双向链表和双向循环链表
双向链表(Doubly Linked List) 定义: 每个节点包含三个部分: 数据域。前驱指针域(指向前一个节点)。后继指针域(指向下一个节点)。 支持从任意节点向前或向后遍历。 #define dat…...
鸿蒙开发:了解正则表达式
前言 从给出的文本中,按照既定的相关规则,匹配出符合的数据,其中的规则就是正则表达式,使用正则表达式,可以使得我们用简洁的代码就能实现一定复杂的逻辑,比如判断一个邮箱账号是否符合正常的邮箱账号&…...
【juc】AQS是什么
目录 1. 说明2. 资源共享方式3. 核心思想与实现4. 自定义同步器5. 常用实现类 1. 说明 1.AQS是AbstractQueuedSynchronizer的简称,即抽象的队列式同步器,也可以称作队列同步器。2.它是Java并发包(java.util.concurrent)中的一个重…...
最好用的图文识别OCR -- PaddleOCR(1) 快速集成
最近在项目中遇到了 OCR 的需求,希望能够实现高效而准确的文字识别。由于预算限制,我并未选择商业付费方案,而是优先尝试了开源工具。一开始,我测试了 GOT-OCR2.0,但由于我的 Mac 配置较低,不支持 GPU 运算…...
【最新】17个一站式数据集成平台案例PPT下载(Apache SeaTunnel )
17个Apache SeaTunnel案例下载见附件! 开发篇 1.Apache SeaTunnel——OLAP 引擎的数据动脉 1.1项目定位——EtLT 时代的新一代数据集成平台 1.2Apache SeaTunnel 核心功能 1.3Apache SeaTunnel 在 OLAP 场景下的应用 1.4WhaleTunnel 产品特性 2.教你从头到尾开发一…...
第2章波动光学引论—抓本质,本质必定简单
1波动光学的电磁理论 1.1波动方程 1)波动方程是通过描述波函数随时间和空间的变化来表达波动的传播和演化。 2)一维波动方程: a.一维波动方程描述了沿着一条直线传播的波动。它的一般形式为: ∂u/∂t v ∂u/∂x 其中ÿ…...
基于通义千问2-VL-7B-Instruct模型的微调技术指南
基于通义千问2-VL-7B-Instruct模型的微调技术指南 引言 通义千问2-VL-7B-Instruct 是一个强大的多模态大语言模型,支持文本和图像的联合理解与生成。为了使其在特定任务或领域上表现更优,微调(Fine-tuning)是一个关键步骤。本文将详细介绍如何对通义千问2-VL-7B-Instruct…...
IDEA XML 文件 SQL 提示
首先连接到对应的数据库。Database 里面要填写对应的数据库名称 配置当前项目的 SQL 方言,例如我这里是 MySQL 数据库管理系统,那么就选择 MySQL 此时就有 SQL 语法、表名、字段名等提示信息了...
Node.js 模块系统
Node.js 模块系统 1. 引言 Node.js,作为一个轻量级、高效的服务器端 JavaScript 运行环境,其模块系统是其最核心的特性之一。Node.js 的模块系统允许开发者将代码组织成多个文件,每个文件都是一个模块,这样可以提高代码的可维护性和可重用性。本文将详细介绍 Node.js 的模…...
面试题:@Transactional 注解在自调用情况下会失效原因
Transactional 注解在自调用情况下会失效,这主要是由于 Spring 事务管理的实现机制所导致的。以下是对这一问题的详细解释: 一、Spring 事务管理的实现机制 Spring 的事务管理是基于 AOP(面向切面编程)实现的,它通过…...
KMP 2024 年总结,Kotlin 崛起的一年
2024 Google I/O 上正式官宣了 KMP(Kotlin Multiplatform)项目,它是 Google Workspace 团队的一项长期「投资」项目,由 JetBrains 开发维护和开源的项目,简单来说,JetBrains 主导,Google Worksp…...
super_vlan
Super VLAN产生的背景 就经典的酒店例子来说,若是将101房和102房的网络划分在同一个vlan下面,那么101房出现了一个懂得某些安全技术的大佬,就会使得102房的隐私得到严重的隐患 所以这时我们就需要将二层给隔离开,但又要去保证10…...
Harbor仓库部署安装、向仓库推送,拉取镜像、容器的基础使用(超级详细,非常透彻)
Harbor 环境搭建笔记 作为新手,在搭建 Harbor 环境的过程中,我参考了大量资料,学到了很多宝贵的知识,但也遇到了不少挑战。虽然目前这套环境仅在测试环境中成功运行,但仍有许多细节需要完善。记录这些经验不仅有助于个…...
【论文+源码】一个基于SSM(Spring + Spring MVC + MyBatis)的公寓电能计量系统
为了实现一个基于SSM(Spring Spring MVC MyBatis)的公寓电能计量系统,我们需要创建一个简单的Web应用程序来记录和显示每个公寓的电能使用情况。以下是一个基本的实现示例。 我们将包括以下几个部分: 数据库表设计实体类DAO层…...
开源架构的容器化部署优化版
上三篇文章推荐: 开源架构的微服务架构实践优化版(New) 开源架构中的数据库选择优化版(New) 开源架构学习指南:文档与资源的智慧锦囊(New) 我管理的社区推荐:【青云交社区…...
linux安装redis及Python操作redis
目录 一、Redis安装 1、下载安装包 2、解压文件 3、迁移文件夹 4、编译 5、管理redis文件 6、修改配置文件 7、启动Redis 8、将redis服务交给systemd管理 二、Redis介绍 1、数据结构 ①字符串String ②列表List ③哈希Hash ④集合Set ⑤有序集合Sorted Set 2、…...
万里数据库GreatSQL监控解析
GreatSQL是MySQL的一个分支,专注于提升MGR(MySQL Group Replication)的可靠性及性能。乐维监控平台可以有效地监控GreatSQL,帮助用户及时发现并解决潜在的性能问题。 通过在GreatSQL服务器上安装监控代理,收集数据库性…...
商米电子秤服务插件
概述 SunmiScaleUTS封装商米电子秤服务模块,支持商米旗下S2, S2CC, S2L CC等设备,设备应用于超市、菜市场、水果店等,用于测量商品的重量,帮助实现快捷、准确、公正的交易等一系列商业场景。 功能说明 SDK插件下载 一. 电子秤参数 型号:S2, S2CC, …...
Java-写一个计数器
一个简单的线程安全的计数器实现。我们将使用AtomicInteger来确保计数操作是线程安全的,并 且提供基本的增减和获取计数值的功能。 简单线程安全计数器 import java.util.concurrent.atomic.AtomicInteger;public class Counter {private final AtomicInteger count = new …...
VSCode 终端显示“pnpm : 无法加载文件 C:\Program Files\nodejs\npm.ps1,因为在此系统上禁止运行脚本”
VSCode 终端显示“pnpm : 无法加载文件 C:\Program Files\nodejs\npm.ps1,因为在此系统上禁止运行脚本”VSCode 终端显示“pnpm : 无法加载文件 C:\Program Files\nodejs\npm.ps1,因为在此系统上禁止运行脚本”解决方案: 1.用get-ExecutionP…...
微信小程序 单选多选radio/checkbox 纯代码分享
单选按钮 <radio-group class"radiogroup" bindchange"radioChange"> <label class"radio" wx:for"{{items}}"> <radio value"{{item.name}}" checked"{{item.checked}}" /> {{item.value}} &…...
Visual Studio 2022安装教程
1、下载网址 Visual Studio 2022 IDE安装网址借助 Visual Studio 设计,具有自动完成、构建、调试、测试功能的代码将与 Git 管理和云部署融为一体。https://visualstudio.microsoft.com/zh-hans/vs/ 点击图片所示 双击运行 2、安装 点击C桌面开发(右边…...
批量读取pdf发票中二维码的信息
如下代码Java类: import com.alibaba.excel.EasyExcel; import com.alibaba.excel.ExcelWriter; import com.alibaba.excel.annotation.ExcelProperty; import com.alibaba.excel.write.builder.ExcelWriterBuilder; import com.alibaba.excel.write.metadata.Writ…...
Apache Hive常见问题
入门问题 什么是Apache Hive? 解释Hive的用途。Hive作为基于Hadoop的数据仓库工具是如何工作的?与传统关系型数据库相比,使用Hive有什么优势? Hive和关系型数据库管理系统(RDBMS)之间的区别是什么&#…...
SpringCloud源码分析-Gateway
Gateway核心原理,请求经过一系列的责任链最后到达服务端。...
基于N-HiTS神经层次插值模型的时间序列预测——cross validation交叉验证与ray tune超参数优化
论文链接:https://arxiv.org/pdf/2201.12886v3 N-HiTS: Neural Hierarchical Interpolation for TimeSeries Forecasting \begin{aligned} &\text{\large \color{#CDA59E}N-HiTS: Neural Hierarchical Interpolation for TimeSeries Forecasting}\\ \end{aligne…...
Windmill 实战:快速构建自动化工作流和用户界面
1. 引言 在当今快节奏的开发环境中,能够快速构建内部工具和自动化工作流的平台变得越来越重要。Windmill 就是这样一个强大的开源开发者基础设施平台,它能够将脚本自动转换为工作流程和用户界面。本文将深入探讨 Windmill 的使用,从安装到实际应用,帮助您了解如何利用这个…...
51c自动驾驶~合集44
我自己的原文哦~ https://blog.51cto.com/whaosoft/12969097 #Towards Generalist Robot Policies 清华大学&字节 | 迈向通用机器人策略:如何选择VLA? 论文标题:Towards Generalist Robot Policies: What Matters in Building Vision…...
设计模式 创建型 工厂模式(Factory Pattern)与 常见技术框架应用 解析
工厂模式(Factory Pattern)是一种创建型设计模式,它提供了一种封装对象创建过程的方式,使得对象的创建与使用分离,从而提高了系统的可扩展性和可维护性。 一、核心思想 工厂模式的核心思想是将“实例化对象”的操作与…...
ElasticSearch7.10-分词器
文章目录 分词器1.字符过滤器1.介绍2.过滤html标签3.mappings过滤规则(屏蔽非文明用语)4.正则替换 2.自定义分词器1.代码2.查询 3.中文分词器1.下载ik分词器7.10.0版本(跟es对应)2.应用ik分词器1.进入插件目录下创建一个ik目录2.将…...
MLP、CNN、Transformer 的区别解析
亲爱的小伙伴们😘,在求知的漫漫旅途中,若你对深度学习的奥秘、Java 与 Python 的奇妙世界,亦或是读研论文的撰写攻略有所探寻🧐,那不妨给我一个小小的关注吧🥰。我会精心筹备,在未来…...
Android Camera压力测试工具
背景描述: 随着系统的复杂化和业务的积累,日常的功能性测试已不足以满足我们对Android Camera相机系统的测试需求。为了确保Android Camera系统在高负载和多任务情况下的稳定性和性能优化,需要对Android Camera应用进行全面的压测。 对于压…...
[Qt] 常用控件 | QWidget | “表白程序2.0”
目录 一、控件概述 控件体系的发展阶段: 二、QWidget 核心属性 核心属性概览: 1、enabled 2、Geometry 实例 1: 控制按钮的位置 实例 2: 表白 程序 i、Window Frame 的影响 ii、API 设计理念 iii、Geometry 和 FrameGeometry 的区别 …...
word无法插入svg格式图片
插入后出现这样的窗口,表明word版本低,没有svg这个选项。 因此这就是区别。在b站找升级word视频。...
【UE5 C++课程系列笔记】20——共享指针的简单使用
目录 概念 创建共享指针示例 重设共享指针 共享指针内容转移 概念 共享指针(主要以 TSharedPtr 为例),TSharedPtr 基于引用计数机制来工作,旨在解决对象所有权共享以及确保在合适的时候自动释放对象资源的问题。它允许多个 TS…...
Oracle 数据库 dmp文件从高版本导入低版本的问题处理
当前有个需求是将oracle 19c上的数据备份恢复到oracle 11g上使用。我们通过exp命令远程进行备份,然后通过imp进行恢复时出现IMP-00010: not a valid export file, header failed verification报错。 这是数据库版本问题,在使用exp命令导出的时候使用的客…...
Tomcat优化指南
以下是一份详细的Tomcat优化指南: 一、JVM(Java虚拟机)优化 内存设置 堆内存(Heap Memory) 调整-Xms(初始堆大小)和-Xmx(最大堆大小)参数。一般来说,将初始…...