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

Linux进程信号

信号量

本质是一个计数器,用来表示系统资源中,资源数量多少的问题。

公共资源:能被多个进程同时访问的资源。

访问没有被保护的资源,可能会出现数据不一致问题。

让不同进程看到同一个资源的目的是想通信。

为了解决进程具有独立性无法 ,让进程看到同一个资源,解决过程中,又引入了数据不一致问题。

未来被保护起来的公共资源,一般是临近资源。是共享的。

其他的进程中申请的资源大部分是独立资源。

资源是要被使用的,有进程对应的代码会访问这部分资源。

访问临近资源的代码是临界区,不访问临近资源的代码是非临界区。

要么不做,要做就做完:原子性。

为什么要信号量

想买电影票的座位号,当想要某种资源时,可以进行预订。

共享资源:作为一个整体使用,划分成为一个一个资源的子部分。

进程申请信号量成功 相当于预订了共享资源的一部分,可以访问这部分资源,否则就不可以,就可以实现保护共享资源的目的。

 

 当信号量是1 代表对共享资源整体访问,实现互斥功能。

所有IPC资源的第一个字段都是ipc_perm的结构,可以定义一个指针数组,不同对象,可以用相同指针数组存储。

 信号:

 

 信号不一定立即被处理,需要时间窗口。

 共识:信号是给进程发的。

进程如何识别信号?认识+动作。

进程是程序员编写的属性和逻辑的集合,是程序员编码完成的。

进程本身要有对信号的保存能力。

进程处理信号称为信号被捕捉。

 进程保存信号,保存在进程task_struct 结构体中。

发送信号本质是修改进程pcb中的信号位图。

 PCB是内核维护的数据结构对象。

PCB管理者是OS。

发送信号的方式都是通过OS向进程发送的信号。

kill 命令底层一定调用了对应的系统调用。

 

自定义信号操作: 

#include<iostream>
#include<unistd.h>
#include<signal.h>
using namespace std;void handler(int signo)
{cout<<"进程捕捉到一个信号,该信号是:"<<signo<<endl;
}
int main()
{signal(2,handler);while(true){cout<<"我是一个进程"<<getpid()<<endl;sleep(2);}
}

 

利用系统调用接口,模拟实现kill。

raise,给自己发任意的信号。 相当于kill(getpid(),3)。

 

 abort():给自己发送指定的信号。信号SIGABRT。

 异常捕捉:

#include<iostream>
#include<signal.h>
#include<unistd.h>
using namespace std;
void catchSig(int signo)
{cout<<"获取到一个信号,信号编号是"<<signo<<endl;
}
int main(int argc,char* argv[])
{int cnt=10;signal(SIGFPE,catchSig);while(cnt--){cout<<"cnt:"<<cnt<<endl;sleep(1);int a=10;a/=0;}
}

收到信号不一定引起进程退出,进程没有退出就有可能还被调度。

CPU内部寄存器只有一份,但是寄存器中内容属于进程上下文。 

状态寄存器cpu自己维护,不能更改它。

进程被切换时,就有无数次状态寄存器被保存和恢复的过程。 

每次恢复时,就让操作系统识别到了CPU内部状态寄存器的溢出标志位。

OS将 硬件问题转换为软件问题,向目标进程发信号,导致异常。

当程序捕获到 SIGFPE 信号并调用 catchSig 后,程序会恢复到触发信号的那一行(a/=0;),导致再次触发 SIGFPE 信号。因此 catchSig 函数会一直被调用,形成无限循环。

软件条件:类似与管道通信,读端关闭,写端也关闭。

软件条件闹钟:

#include<iostream>
#include<signal.h>
#include<unistd.h>
using namespace std;int main(int argc,char* argv[])
{alarm(1);int cnt=10;while(true){cout<<"cnt:"<<cnt++<<endl;}   
}

#include<iostream>
#include<signal.h>
#include<unistd.h>
using namespace std;
int cnt=0;
void catchSig(int signo)
{cout<<"获取到一个信号,信号编号是:"<<cnt<<endl;
}
int main(int argc,char* argv[])
{signal(SIGALRM,catchSig);alarm(1);while(true){// cout<<"cnt:"<<cnt++<<endl;cnt++;}   
}

一次性闹钟信号。 

catchSig函数中加入alarm闹钟。 

#include<iostream>
#include<signal.h>
#include<unistd.h>
using namespace std;
int cnt=0;
void catchSig(int signo)
{cout<<"获取到一个信号,信号编号是:"<<cnt<<endl;alarm(1);
}
int main(int argc,char* argv[])
{signal(SIGALRM,catchSig);alarm(1);while(true){// cout<<"cnt:"<<cnt++<<endl;cnt++;}   
}

 闹钟其实是用软件实现的

OS周期性检查闹钟,超时后,发送SIGALARM信号。

3:记录在进程PCB中

4: 系统程序员默认写好

5:更改目标进程PCB信号位图

核心转储

段错误是执行动作是Core 。核心转储。

 

 核心转储目的是支持调试。

直接定位到出错地方。 

#include<iostream>
#include<signal.h>
#include<unistd.h>
using namespace std;
int cnt=0;
void catchSig(int signo)
{cout<<"捕捉到一个异常,编号是:"<<signo<<endl;
}
int main(int argc,char* argv[])
{for(int i=1;i<=31;i++){signal(i,catchSig);}while(1){cout<<"这是一个进程,pid:"<<getpid()<<endl;sleep(1);}}

  kill -9 9号信号不能被捕捉。

实际执行信号处理动作叫信号递达。

信号从产生到递达之间的状态,交信号未决。

进程可以阻塞某个信号。

2个位图,一个数组分别代表未决,阻塞,处理状态。

 一个信号没有产生,并不妨碍它可以被阻塞。

信号产生时候不会被立即处理,而是在合适的时候,从内核态转为用户态时处理。

用户为了访问内核或硬件资源,必须通过系统调用完成访问。

实际执行系统调用的人是进程,身份其实是内核。

系统调用较费时间。尽量避免频繁进行系统调用。

凡是和当前进程相关的数据,都是当前进程的上下文数据。

CPU对应的CR3寄存器,为0是内核态,为3为用户态。
跳转到内核态,为了进行系统调用。

进程要执行系统调用,就从用户空间跳到内核空间后,调用内核级页表,执行系统调用。还需要从用户态变到内核态。

 

不会更改内核空间:

 pending为1代表收到,handler是处理方法。

handler处理信号方式,包括默认,忽略和自定义。

 所有语言 直接间接访问系统资源,IO,访问硬件 一定经过操作系统,经过操作系统一定有系统调用,有系统调用一定会切到系统内核。

 执行handler中的自定义处理方法,需要转为用户态。防止用户态程序利用内核态身份非法操作。

在用户态执行完handler函数后,需要返回到内核态,获取进程程序位置后,再返回到用户态进程继续执行。

自定义信号处理过程:

sigset_t

 信号集包括pending信号集和block信号集,block信号集一般叫信号屏蔽字。

默认情况,所有信号都是不被阻塞的,如果一个信号被屏蔽了,该信号不会被递达。

#include<iostream>
#include<signal.h>
#include<unistd.h>
using namespace std;#define BLOCK_SIGNAL 2
#define MAX_SIGNUM 31
static void show_pending(const sigset_t &pending)
{for(int signo=1;signo<=MAX_SIGNUM;signo++){if(sigismember(&pending,signo)){cout<<"1";}else cout<<"0";}cout<<endl;
} 
int main()
{sigset_t block,oblock,pending;//初始化sigemptyset(&block);sigemptyset(&oblock);sigemptyset(&pending);//添加要屏蔽的信号sigaddset(&block,BLOCK_SIGNAL);//开始屏蔽,设置进内核sigprocmask(SIG_SETMASK,&block,&oblock);//遍历打印pending信号集while(true){//初始化sigemptyset(&pending);//获取sigpending(&pending);//打印show_pending(pending);sleep(1);}
}

捕捉2号信号,并屏蔽。

用数组选择要屏蔽的信号。

#include<iostream>
#include<signal.h>
#include<unistd.h>
#include<vector>
using namespace std;#define BLOCK_SIGNAL 2
#define MAX_SIGNUM 31static vector<int> sigarr={2,4};
static void show_pending(const sigset_t &pending)
{for(int signo=1;signo<=MAX_SIGNUM;signo++){if(sigismember(&pending,signo)){cout<<"1";}else cout<<"0";}cout<<endl;
} 
int main()
{sigset_t block,oblock,pending;//初始化sigemptyset(&block);sigemptyset(&oblock);sigemptyset(&pending);//添加要屏蔽的信号sigaddset(&block,BLOCK_SIGNAL);//开始屏蔽,设置进内核for(const auto& sig:sigarr ){sigaddset(&block,sig);}sigprocmask(SIG_SETMASK,&block,&oblock);//遍历打印pending信号集while(true){//初始化sigemptyset(&pending);//获取sigpending(&pending);//打印show_pending(pending);cout<<"pid:"<<getpid()<<endl;sleep(1);}
}

恢复屏蔽:

#include<iostream>
#include<signal.h>
#include<unistd.h>
#include<vector>
using namespace std;#define BLOCK_SIGNAL 2
#define MAX_SIGNUM 31static vector<int> sigarr={2,4};
static void show_pending(const sigset_t &pending)
{for(int signo=1;signo<=MAX_SIGNUM;signo++){if(sigismember(&pending,signo)){cout<<"1";}else cout<<"0";}cout<<endl;
} 
int main()
{sigset_t block,oblock,pending;//初始化sigemptyset(&block);sigemptyset(&oblock);sigemptyset(&pending);//添加要屏蔽的信号sigaddset(&block,BLOCK_SIGNAL);//开始屏蔽,设置进内核for(const auto& sig:sigarr ){sigaddset(&block,sig);}sigprocmask(SIG_SETMASK,&block,&oblock);int cnt=15;//遍历打印pending信号集while(true){//初始化sigemptyset(&pending);//获取sigpending(&pending);//打印show_pending(pending);cout<<"pid:"<<getpid()<<endl;sleep(1);if(cnt--<=0){sigprocmask(SIG_SETMASK,&oblock,&block);cout<<"恢复对信号的屏蔽,不屏蔽任何信号"<<endl;}}
}

屏蔽恢复成功,但没有打印,因为是2信号,恢复后,进入内核态进程中止,进程不会返回用户态 

 自定义捕捉2号信号,验证恢复抵达成功。

#include<iostream>
#include<signal.h>
#include<unistd.h>
#include<vector>
using namespace std;#define BLOCK_SIGNAL 2
#define MAX_SIGNUM 31static vector<int> sigarr={2,4};
static void show_pending(const sigset_t &pending)
{for(int signo=1;signo<=MAX_SIGNUM;signo++){if(sigismember(&pending,signo)){cout<<"1";}else cout<<"0";}cout<<endl;
} 
void myhandler(int signo)
{cout<<signo<<"号信号已经被抵达"<<endl;
}
int main()
{sigset_t block,oblock,pending;//初始化sigemptyset(&block);sigemptyset(&oblock);sigemptyset(&pending);//添加要屏蔽的信号sigaddset(&block,BLOCK_SIGNAL);//开始屏蔽,设置进内核for(const auto& sig:sigarr ){   signal(sig,myhandler);sigaddset(&block,sig);}sigprocmask(SIG_SETMASK,&block,&oblock);int cnt=15;//遍历打印pending信号集while(true){//初始化sigemptyset(&pending);//获取sigpending(&pending);//打印show_pending(pending);cout<<"pid:"<<getpid()<<endl;sleep(1);if(cnt--<=0){sigprocmask(SIG_SETMASK,&oblock,&block);cout<<"恢复对信号的屏蔽,不屏蔽任何信号"<<endl;}}
}

 sigaction:

#include<iostream>
#include<signal.h>
#include<unistd.h>
#include<vector>
using namespace std;void handler(int signo)
{cout<<"get a signo"<<signo<<endl;
}
int main()
{struct sigaction act,oact;act.sa_handler=handler;act.sa_flags=0;sigemptyset(&act.sa_mask);sigaction(SIGINT,&act,&oact);while(true)sleep(1);return 0;
}

 当信号处理时间很长的情况。

#include<iostream>
#include<signal.h>
#include<unistd.h>
#include<vector>
using namespace std;void handler(int signo)
{cout<<"get a signo"<<signo<<"正在处理"<<"pid:"<<getpid()<<endl;sleep(15);
}
int main()
{struct sigaction act,oact;act.sa_handler=handler;act.sa_flags=0;sigemptyset(&act.sa_mask);sigaction(SIGINT,&act,&oact);while(true)sleep(1);return 0;
}

最终只处理了2个信号。 

 

 

 

 

上一个信号处理完,会自动解除对上一个信号和当前设置的信号的屏蔽。

 

 可重入函数

 

#include<iostream>
#include<signal.h>
#include<unistd.h>
#include<vector>
using namespace std;int quit=0;
void handler(int signo)
{cout<<signo<<"信号正在被捕捉"<<endl;cout<<"quit:"<<quit;quit=1;cout<<"->"<<quit<<endl;
}
int main()
{signal(2,handler);while(!quit)sleep(1);cout<<"我是正常退出的"<<endl;return 0;
}

相关文章:

Linux进程信号

信号量 本质是一个计数器&#xff0c;用来表示系统资源中&#xff0c;资源数量多少的问题。 公共资源:能被多个进程同时访问的资源。 访问没有被保护的资源&#xff0c;可能会出现数据不一致问题。 让不同进程看到同一个资源的目的是想通信。 为了解决进程具有独立性无法 …...

东风破捉妖师横空出世

一.异动拉升实时监测 东风破就像是一个大盘监测平台&#xff0c;是现实版的捉妖师&#xff0c;一旦妖股横空出世&#xff0c;就会在东风破面前原形毕露。东风破AI算法逻辑是监测存在异动拉升的股票&#xff0c;实时分析上证&#xff0c;深证&#xff0c;创业和科创板的股票数据…...

初窥门径:React中的事件机制

React中的事件机制 什么是合成事件&#xff1f;使用合成事件的好处事件委托事件池 React事件执行顺序 什么是合成事件&#xff1f; 在React中&#xff0c;合成事件&#xff08;Synthetic Events&#xff09; 是一种跨浏览器的事件包装机制&#xff0c;旨在统一浏览器的事件处理…...

【Android、IOS、Flutter、鸿蒙、ReactNative 】实现 MVP 架构

Android Studio 版本 Android Java MVP 模式 参考 模型层 model public class User {private String email;private String password;public User(String email, String password) {this.email = email;this.password = password;}public String getEmail() {return email;}…...

DroneCAN 最新开发进展,Andrew在Ardupilot开发者大会2024的演讲

本文是Andrew演讲的中文翻译&#xff0c;你可以直接观看视频了解演讲的全部内容&#xff0c;此演讲视频的中文版本已经发布在Ardupilot社区的Blog板块&#xff0c;你可以在 Arudpilot官网&#xff08;https://ardupilot.org) 获取该视频&#xff1a; 你也可以直接通过Bilibili链…...

从 App Search 到 Elasticsearch — 挖掘搜索的未来

作者&#xff1a;来自 Elastic Nick Chow App Search 将在 9.0 版本中停用&#xff0c;但 Elasticsearch 拥有你构建强大的 AI 搜索体验所需的一切。以下是你需要了解的内容。 生成式人工智能的最新进展正在改变用户行为&#xff0c;激励开发人员创造更具活力、更直观、更引人入…...

如何给GitHub的开源项目贡献PR

&#x1f3af;导读&#xff1a;本文详细介绍了如何向开源项目“代码随想录”贡献自己的题解。首先&#xff0c;需要Fork原项目的仓库至个人GitHub账户&#xff0c;然后解决克隆仓库时可能遇到的SSH密钥问题。接着&#xff0c;按照标准流程对本地仓库进行代码或文档的修改&#…...

架构-微服务-服务配置

文章目录 前言一、配置中心介绍1. 什么是配置中心2. 解决方案 二、Nacos Config入门三、Nacos Config深入1. 配置动态刷新2. 配置共享 四、nacos服务配置的核心概念 前言 服务配置--Nacos Config‌ 微服务架构下关于配置文件的一些问题&#xff1a; 配置文件相对分散。在一个…...

鱼眼相机模型-MEI

参考文献&#xff1a; Single View Point Omnidirectional Camera Calibration from Planar Grids 1. 相机模型如下&#xff1a; // 相机坐标系下的点投影到畸变图像// 输入&#xff1a;相机坐标系点坐标cam 输出&#xff1a; 畸变图像素点坐标disPtvoid FisheyeCamAdapter::…...

设计模式——抽象工厂模式

定义与概念 抽象工厂模式是一种创建型设计模式。它提供了一个创建一系列相关或相互依赖对象的接口&#xff0c;而无需指定它们具体的类。简单来说&#xff0c;抽象工厂就像是一个工厂的抽象蓝图&#xff0c;这个蓝图定义了生产一组产品的方法&#xff0c;但具体怎么生产这些产…...

大语言模型(LLM)不平衡的内存使用问题;训练过程中 Transformer层1和Transformer层2的反向传播计算量差异

目录 大语言模型(LLM)不平衡的内存使用问题 一、不平衡的内存使用概述 二、不平衡的内存使用举例 嵌入层与Transformer层之间的内存差异: 不同Transformer层之间的内存差异: 输入数据对内存使用的影响: 三、不平衡的内存使用带来的问题 四、解决方案 大语言模型的…...

AI需求条目化全面升级!支持多格式需求,打破模板限制!

AI需求条目化全面升级&#xff01;支持多格式需求&#xff0c;打破模板限制&#xff01; 一、多格兼济 标准立成 1、功能揭秘 预览未来 平台需求板块的AI需求条目化功能迎来全面升级。它支持多种需求格式&#xff0c;不再受限于模板文件&#xff0c;能够一键自动快速且灵活地生…...

C#:时间与时间戳的转换

1、将 DateTime 转换为 Unix 时间戳&#xff08;秒&#xff09; public static long DateTimeToUnixTimestamp(DateTime dateTime) {// 定义UTC纪元时间DateTime epochStart new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);// 计算从UTC纪元时间到指定时间的总秒数Tim…...

输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。-多语言

目录 C 语言实现 Python 实现 Java 实现 Js 实现 Ts 实现 题目&#xff1a;输入一行字符&#xff0c;分别统计出其中英文字母、空格、数字和其它字符的个数。 程序分析&#xff1a;利用while语句,条件为输入的字符不为\n。 C 语言实现 #include <stdio.h>int mai…...

贪心-区间问题——acwing

题目一&#xff1a;最大不相交区间数量 908. 最大不相交区间数量 - AcWing题库 分析 跟区间选点一样。区间选点&#xff1a;贪心——acwing-CSDN博客 代码 #include<bits/stdc.h> using namespace std;const int N 1e510;struct Range {int l, r;// 重载函数bool op…...

OpenCV相机标定与3D重建(8)相机标定函数calibrateCamera()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 从校准图案的多个视图中找到相机的内参和外参参数. cv::calibrateCamera 是 OpenCV 中用于相机标定的一个非常重要的函数。它通过一系列已知的世…...

Maven 插件

为 Maven 插件配置环境变量通常涉及到设置 Java 环境变量以及 Maven 相关的环境变量。以下是一些基本步骤&#xff1a; 1. 设置 Java 环境变量 Maven 需要 Java 运行环境&#xff0c;因此您需要确保 Java 的环境变量已经正确设置。 - **JAVA_HOME**&#xff1a;指向您的 Java…...

【Java基础入门篇】一、变量、数据类型和运算符

Java基础入门篇 一、变量、数据类型和运算符 1.1 变量 计算机中的数据表示方式是&#xff1a;“二进制(0/1)”&#xff0c;但是同时也可以兼容其他进制&#xff0c;例如八进制、十进制、十六进制等。 Java变量的本质是&#xff1a;存储在固定空间的内容&#xff0c;变量名是…...

[论文阅读]Poisoning Retrieval Corpora by Injecting Adversarial Passages

Poisoning Retrieval Corpora by Injecting Adversarial Passages 通过注入对抗性文本对检索语料库进行中毒 http://arxiv.org/abs/2310.19156 EMNLP2023 文章的目标就是要让检索器检索的结果包含攻击者生成的对抗性文本&#xff0c;如果能够检索到&#xff0c;则认为攻击成…...

[Redis#10] scan | db_0 | redis_cli | RESP | C++-redis启动教程

目录 1. 渐进式遍历 1.2 常见指令 - scan 2. 数据库管理 3.redis 客户端 是否前面学习的这些 redis 命令&#xff0c;没有价值了呢&#xff1f; 4.RESP 自定义协议 为什么能编写出一个自定义的 Redis 客户端&#xff1f; RESP 协议 5.在 Ubuntu 下启用 C 操作 Redis …...

LCR 151.彩灯装饰记录III

题目 代码 class Solution { public List<List> levelOrder(TreeNode root) { if(root null){ return new ArrayList<>(); } Queue<TreeNode> queue new LinkedList<>();List<List<Integer>> res new ArrayList<>();int sum 1;…...

vue实现滚动条滑动到底部分页调取后端接口加载数据

一、案例效果 二、前提条件 接口返回数据 三、案例代码 子组件 const $emit defineEmits([cloneItem, updateList]);const props defineProps({rightList: {type: Array,},chartTableData: {type: Array as () > ChartListType[],},deleteChartInfo: {type: Object,}…...

Vscode连接服务器

在VS Code中连接服务器的主要步骤如下‌&#xff1a;‌ 1.‌安装Remote-SSH插件‌&#xff1a;打开VS Code&#xff0c;进入插件市场搜索“Remote-SSH”并安装。安装完成后&#xff0c;VS Code的侧边栏会出现一个远程资源管理器的图标。 2.‌配置服务器信息‌&#xff1a;点击…...

工作中Linux 内核的链表算法的使用

在 Linux 内核中,链表是一个非常重要的数据结构,广泛用于各种场景,如任务调度、设备管理、进程管理等。Linux 内核提供了高效且灵活的链表实现,能够更好地管理系统中的数据和对象。我们将深入浅出地讲解 Linux 内核链表的实现原理、用法,并举例展示如何使用。 1. 链表基本…...

洛谷P1115

最大子段和 - 洛谷 最大子段和 题目描述 给出一个长度为 n的序列a&#xff0c;选出其中连续且非空的一段使得这段和最大。 输入格式 第一行是一个整数&#xff0c;表示序列的长度n。 第二行有n个整数&#xff0c;第i个整数表示序列的第 i个数字 a_i。 输出格式 输出一行…...

USB Type-C一线通扩展屏:多场景应用,重塑高效办公与极致娱乐体验

在追求高效与便捷的时代&#xff0c;启明智显USB Type-C一线通扩展屏方案正以其独特的优势&#xff0c;成为众多职场人士、娱乐爱好者和游戏玩家的首选。这款扩展屏不仅具备卓越的性能和广泛的兼容性&#xff0c;更能在多个应用场景中发挥出其独特的价值。 USB2.0显卡&#xff…...

使用Native AOT发布C# dll 提供给C++调用

Native AOT&#xff0c;即提前本地编译&#xff08;Ahead-Of-Time Compilation&#xff09;&#xff0c;是一种将托管代码&#xff08;如 C#&#xff09;编译为本机可执行文件的技术&#xff0c;无需在运行时进行任何代码生成。 &#xff08;Native AOT 优缺点截图摘自张善友博…...

Excel中根据某列内容拆分为工作簿

简介&#xff1a;根据A列的内容进行筛选&#xff0c;将筛选出来的数据生成一个新的工作簿(可以放到指定文件夹下)&#xff0c;且工作簿名为筛选内容。 举例&#xff1a; 将上面的内容使用VBA会在当前test1下生成5个工作簿&#xff0c;工作簿名分别为TEST1.xls TEST2.xls TEST3…...

网络安全体系与网络安全模型

4.1 网络安全体系概述 4.1.1 网络安全体系概述 一般面言&#xff0c;网络安全体系是网络安全保障系统的最高层概念抽象&#xff0c;是由各种网络安全单元按照一定的规则组成的&#xff0c;共同实现网络安全的目标。网络安全体系包括法律法规政策文件、安全策略、组织管理、技术…...

彻底理解quadtree四叉树、Octree八叉树 —— 点云的空间划分的标准做法

1.参考文章&#xff1a; &#xff08;1&#xff09;https://www.zhihu.com/question/25111128 这里面的第一个回答&#xff0c;有一幅图&#xff1a; 只要理解的四叉树的构建&#xff0c;对于八叉树的构建原理类比方法完全一样&#xff1a;对于二维平面内的随机分布的这些点&…...

Altium Designer脚本工具定制

原理图设计自动化 ➡️Altium原理图检查工具 ➡️元器件参数集导入导出 ➡️原理图符号自动创建 ➡️原理图高级查找 ➡️原理图库文档高级查找 ➡️原理图文档对比 ➡️原理图库文档对比 PCB设计自动化 ➡️各种各样的PCB线圈自动创建 ➡️PCB文档导出成SVG格式文档…...

容器化与容器编排(Containerization and Orchestration)

一、容器化与容器编排介绍 容器化技术(Containerization)是一种轻量级的虚拟化技术,它允许开发者将应用及其所有依赖打包到一个独立的、隔离的容器中。容器比传统虚拟机(VM)更加轻便、高效,可以跨平台部署,并且提供一致的运行环境。而容器编排(Container Orchestratio…...

娱乐API:快速生成藏头诗、藏尾诗和藏中诗

引言 诗歌是中国传统文化的重要组成部分&#xff0c;其中藏头诗、藏尾诗和藏中诗因其独特的形式而备受喜爱。为了满足广大文学爱好者的需求&#xff0c;我们推出了一款娱乐API&#xff0c;支持快速生成藏头诗、藏尾诗和藏中诗。本文将详细介绍该API的功能、使用方法以及如何将…...

基于Python制作一个简易UI界面

基于Python制作一个简易UI界面 目录 基于Python制作一个简易UI界面1 原理简介2 编写程序3 程序测试 1 原理简介 这里用到了Python自带的UI库tkinter。 tkinter 是 Python 的标准 GUI&#xff08;图形用户界面&#xff09;库&#xff0c;用于创建和管理图形界面。它提供了一个简…...

【视频】OpenCV:读写视频文件VideoCapture和VideoWriter

1、VideoCapture:获取视频 VideoCapture可以从摄像头或者视频文件(eg:mp4,avi)中获取视频数据。 1.1 打开视频 1)打开摄像头 cv::VideoCapture cap(0); 参数:0表示默认摄像头 2)打开视频文件 cv::VideoCapture cap("video.mp4");3)判断是否打开成功 …...

【Leecode】Leecode刷题之路第62天之不同路径

题目出处 62-不同路径-题目出处 题目描述 个人解法 思路&#xff1a; todo代码示例&#xff1a;&#xff08;Java&#xff09; todo复杂度分析 todo官方解法 62-不同路径-官方解法 方法1&#xff1a;动态规划 思路&#xff1a; 代码示例&#xff1a;&#xff08;Java&…...

HarmonyOS NEXT应用开发,关于useNormalizedOHMUrl选项的坑

起因是这样的&#xff1a;我这库打包发布出问题了&#xff0c;这个有遇到的吗&#xff1f; 源码里面就没有 request .d.ts,这打包后哪来个这文件&#xff1f;且漏掉了其他文件。 猫哥csdn.yyz_1987 为啥我打包的har里面&#xff0c;只有接口&#xff0c;没有具体实现呢&#x…...

基于SpringBoot实现的编程训练系统(代码+论文)

&#x1f389;博主介绍&#xff1a;Java领域优质创作者&#xff0c;阿里云博客专家&#xff0c;计算机毕设实战导师。专注Java项目实战、毕设定制/协助 &#x1f4e2;主要服务内容&#xff1a;选题定题、开题报告、任务书、程序开发、项目定制、论文辅导 &#x1f496;精彩专栏…...

Spring Cloud Stream实现数据流处理

1.什么是Spring Cloud Stream&#xff1f; Spring Cloud Stream的核心是Stream&#xff0c;准确来讲Spring Cloud Stream提供了一整套数据流走向&#xff08;流向&#xff09;的API&#xff0c; 它的最终目的是使我们不关心数据的流入和写出&#xff0c;而只关心对数据的业务处…...

DETR:End-to-End Object Detection with Transformers

【DETR 论文精读【论文精读】-哔哩哔哩】 https://b23.tv/Iy9k4O2 【DETR源码解读4-哔哩哔哩】 https://b23.tv/Qp1uH5v 摘要&#xff1a; 将目标检测看作一个集合预测的问题 任务&#xff1a;给定一张图片&#xff0c;预测一组框&#xff0c;每个框需要得到坐标信息和包含的…...

【C++/Qt 】使用QCustomplot类打造一款数学函数图像生成工具(支持latex公式渲染+Python连接AI大模型)

✨✨ Rqtz 个人主页 : 点击✨✨ &#x1f308;Qt系列专栏:点击 软件介绍 基于Qt的开源项目QCustomplot类的一款在线的数学函数图像生成工具&#xff0c;涉及到了数学的latex公式渲染&#xff0c;如何将latex语法转换为Python的函数&#xff0c;和如何在Qt中使用QCustomplot类进…...

Hackathon靶机系列Hackathon2

扫描ip&#xff1a; 获得靶机的ip&#xff1a;192.168.108.134 扫描端口&#xff1a; 获得80端口&#xff0c;7223的ssh和一个ftp服务器服务器中存在两个文件&#xff1a; 先看ftp&#xff1a; 默认用户名为ftp&#xff1a; 下载两个文件&#xff1a; 和 打开flag1.txt: 获得…...

Mybatis 复习

1 什么是MyBatis MyBatis是一个优秀的持久层框架&#xff0c;它对JDBC操作数据库的过程进行封装&#xff0c;使开发者只需要关注 SQL 本身&#xff0c;而不需要花费精力去处理例如注册驱动、创建connection、创建statement、手动设置参数、 结果集检索等JDBC繁杂的过程代码 。…...

BurpSuite安装教程(详细!!附带下载链接)

声明 学习内容来自 B 站UP主泷羽sec&#xff0c;如涉及侵权马上删除文章。 笔记的只是方便各位师傅学习知识&#xff0c;以下网站只涉及学习内容&#xff0c;其他的都与本人无关&#xff0c;切莫逾越法律红线&#xff0c;否则后果自负。 ✍&#x1f3fb;作者简介&#xff1a;致…...

Istio_05_Istio架构

Istio_05_Istio架构 ArchitectureControl PlanePilotCitadelGalley Data PlaneSidecarIstio-proxyPilot-agentMetadta Exchange Ambient Architecture 如: Istio的架构(控制面、数据面) Gateway: Istio数据面的出/入口网关 Gateway分为: Ingress-gateway、Egress-gateway外部访…...

R语言结构方程模型(SEM)在生态学领域中的应用

目录 专题一、R/Rstudio简介及入门 专题二、结构方程模型&#xff08;SEM&#xff09;介绍 专题三&#xff1a;R语言SEM分析入门&#xff1a;lavaan VS piecewiseSEM 专题四&#xff1a;SEM全局估计&#xff08;lavaan&#xff09;在生态学领域高阶应用 专题五&#xff1…...

node.js基础学习-fs模块-文件操作(六)

一、前言 fs模块是 Node.js 内置的文件系统&#xff08;File System&#xff09;模块&#xff0c;它提供了一系列用于与文件系统进行交互的方法。通过fs模块&#xff0c;可以对文件或目录进行读取、写入、删除、重命名、查询状态等操作&#xff0c;这使得 Node.js 能够很好地处…...

EXCEL截取某一列从第一个字符开始到特定字符结束的字符串到新的一列

使用EXCEL中的公式进行特定截取 假设列A是一组产品的编码&#xff0c;我们需要的数据是“-”之前的字段。 我们需要在B1单元格输入公式“LEFT(A1,SEARCH("-",A1)-1)”然后选中B1至B4单元格&#xff0c;按“CTRLD”向下填充&#xff0c;就可以得出其它几行“-”之前的…...

JVM的垃圾回收算法有哪些

标记清除算法 标记清除算法&#xff0c;是将垃圾回收分为2个阶段&#xff0c;分别是标记和清除 根据可达性分析算法得出的垃圾进行标记对这些标记为可回收的内容进行垃圾回收 优点:标记和清除速度较快缺点:碎片化较为严重&#xff0c;内存不连贯的 标记整理算法 优缺点同标记…...

看华为,引入IPD的正确路径

目录 前言 引发重视 作者简介 前言 华为将 IPD 的引入过程归结为三步&#xff1a; 先僵化、后优化、再固化。 如果只是单纯模仿&#xff0c;在不清楚底层逻辑的情况下&#xff0c; 就开始走先僵化的流程&#xff0c;去搞削足适履式的引入。 开始执行后&#xff0c;你就…...