Linux 信号终篇(总结)
前文:本文是对信号从产生到被处理的过程中的概念和原理的总结,如果想了解具体实现,请查看前两篇博客:Linux 信号-CSDN博客、Linux 信号(下篇)-CSDN博客
一、信号的产生
1.1 信号产生的五种条件
①键盘组合键 :“ctrl + c”或者“ctrl + z”等;
②linux命令: kill - signo processpid , 例:杀掉进程号12345的进程 :kill -9 12345 ;
③系统调用:在自己的代码中调用系统调用接口,给某个进程发信号或者给自己发信号常用的几个接口:
#include <sys/types.h>
#include <signal.h>
int kill( pid_t pid, int sig);
//1. pid : 进程pid,想要发送到哪个进程?
//2. sig :要发送的信号码,想要发送什么信号?
//3. 返回值int,失败返回-1
#include <signal.h>
int raise(int sig);
//1. 给自己发信号,相当于 kill(getpid(),sig);
//2. sig: 想要给自己发送的信号
#include <stdlib.h>
void abort(void);
//1.终止自己
//2.给自己发送6号信号 :SIGABRT
④、异常
异常的过程是:当你的进程被调度的时候,cpu执行你的代码,当cpu执行到某行代码时(例如:除0错误或者对空指针访问等)->
cpu知道自己的运算异常,在cpu的状态寄存器中修改溢出标志位->
同时cpu给OS发送硬件异常错误 ->
OS收到cpu硬件异常的报错后去找到对应的进程 ->
并给这个进程发送对应的异常信号,提示这个进程需要注意 ->
如果这个进程不结束,异常一直没有解决,cpu会一直调度这个进程,cpu会一直给OS发送硬件异常错误,OS会一直给这个进程发信号,进程处于死循环;
⑤软件条件
例如:闹钟接口,每隔一段时间给进程发送闹钟信号;
#include <unistd.h>
unsigned int alarm( unsigned int second);
//1. second:每隔多少秒给进程发信号?
//2. 返回值unsigned int 是上一个闹钟剩余的时间
1.2 理解core dump
打开系统的core dump功能,一旦进程出现异常,OS会将进程在内存中的运行信息,给dump(转储)到进程的当前目录(磁盘)上,形成core.pid文件,(核心转储:core dump);
未来在调试的时候,在core-file 直接定位到代码出错行,这是事后调试的方法(运行出错后再调试);
1.3 深度理解信号的发送和产生
①给进程发信号其实是给进程的PCB发的信号;
②所谓的“发信号”,其本质是OS修改PCB内的一个用来管理信号的位图数据结构,这个数据结构其实是一个int的整形,因为一个int 32bit位刚好可以用来表示1~31号信号,所以所谓的“发信号”其实就是对内核数据的写入操作,把对应位置的0写成1,代表信号产生了;
③信号的产生处理整个过程都是OS在操作,因为OS是所有硬件的管理者,只有OS才能直接访问内核数据结构,普通用户只能调用系统接口,因为操作系统不相信任何用户;
二、信号的保存
2.1、信号为什么要保存?
因为进程收到信号之后,可能不会立即处理,会有一个时间窗口,在这个过程中需要先把信号保存起来;
2.2、信号如何保存?进程如何管理信号?
通过三张表:
①block表,位图数据结构,与每个信号映射对应关系,这张表用来记录某个信号是否被屏蔽,如果被屏蔽把对应信号位置的0改1,当取消屏蔽把对应的1再改为0;
②pending表,位图数据结构,与每个信号映射对应关系,这张表用来记录某个信号是否已经产生,是否已经收到某个信号,注意:如果信号已产生但并未处理即(信号未决),把对应信号位置的0改为1,当这个信号被处理后再从对应的1改为0;
③handler表,指针数组结构,这是一个用来保存对信号的处理的方法对应的指针,当未来处理这个信号的时候,直接调用指针指向的方法;注意:这里的处理方法包括三种:SIG_DFL(默认)、SIG_IGN(忽略)、自定义方法;
2.3、操作这三张表相关的接口
因为这三张表属于内核数据结构,所以用户不能对其直接进行访问或修改操作,只能通过系统调用接口;
数据准备工作:信号集函数:
#include <signal.h>
int sigemptyset( sigset_t * set);
//1. 对信号集清空处理操作
//2. set:sigset_t类型结构,是系统封装的位图结构体
#include <signal.h>
int sigaddset( sigset_t * set, int signum);
//1. 添加信号编号到信号集中
//2. set:系统封装的位图结构体
//3. signum想要添加到信号集中的信号编号(未来对这个信号进行操作)
//4. 返回值int,如果成功返回0否则返回-1
#include <signal.h>
int sigismember(const sigset_t *set ,int signo);
//1. 检测信号signo是否存在内核中的pending表中,存在代表信号产生,信号未决;
//2. set: 系统封装的位图结构体
//3. signo: 需要检查的信号
//4. 返回值int,如果不存在返回0,如果存在返回1,如果失败返回-1
#include<signal.h>
int sigpending(sigset_t * set);
//1. 获取内核中pending表的接口
//2. 这是输出型参数,传入set带出内核中的pending表
//3. set: 系统封装的位图结构体
//4. 返回值int,如果获取失败返回值<0
系统调用接口:
#include <signal.h>
int sigprocmask( int how, const sigset_t*set, sigset_t* oset);
//1.how: 当how是SIG_SETMASK时,将set自定义设置好的数据一个一个设置进进程PCB的管理信号的block表里
//2. set: 自定义设置好的位图结构体,oset: 通过oset保存内核更改前的数据以便日后恢复
//3. 当第二个参数传入oset,第三个参数传入nullptr时,代表的是取消屏蔽信号
三、信号的捕捉
3.1两个信号捕捉接口
①:signal
#include <signal.h>
typedef void(*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t handler);
//1. signum: 需要捕捉的信号
//2. handler: 捕捉信号后调用的自定义方法
//3. sighandler_t : 定义的函数指针类型,参数为int,返回值为void
②:sigaction
#include <signal.h>
int sigaction(int signum, struct action * act,struct action* oact);
//1. signum: 需要捕捉的信号
//2. act: 自己创建并设置好的action对象,输入型参数,OS通过act写入到内核数据中
//3. oact: 自己创建初始化好的action对象,输出型参数,通过oact把内核中修改前的数据带出来,以便日后恢复
//4. action: 结构体,成员中包括handler处理方法、sigset_t类型的sa_mask,传入前通过添加sa_mask字段达到信号在处理时屏蔽其它信号的效果;
//5.注意:这个接口需要再传参之前把act、oact创建并初始化好,同时act需要把结构体成员sa_handler(自定义方法)、sa_mask(需要屏蔽的信号)字段设置好(如果你不想屏蔽其它信号可以不设置);
3.2可重入函数理解
例如:当程序运行时向链表头插一个Node1节点,调用insert方法,在方法运行到创建了一个节点,链接到头部,并且正准备让head指向Node1的时候,突然接收到一个信号!这时主函数main会停下来,先执行处理信号的方法,正巧的是处理信号的方法也是insetr即(向链表头插一个节点),那么此时会先运行完处理信号的方法:把Node2头插到链表并把head指向了Node2,处理完后回到主函数main接着刚才的下一步即:让head指向Node1,那么此时Node2无法再被找到!!
简单的代码(不要扣细节,大概意思懂就行):
void insert()
{Node->next=head;//①当main函数执行到这里的时候收到2号信号head=Node;//④回到main刚才被暂停的位置继续往下执行,执行完后Node2没有指针指向它,成为丢失节点!!
}
void handler(int signo)
{list->insert(Node);//③执行inser成功头插并把head指向Node
}
int main()
{signal(2,handler);//② 二号信号被捕获并跳转到自定义的handler方法list->insert(Node1);return 0;
}
重入函数:如果一个函数被重复进入的情况下,出错了或者可能出错那么这个函数为不可重入函数!反之则是可重入函数!!!
3.3、volatile
volatile的作用:防止编译器过度优化,保持内存可见性!!
代码:
#include <iostream>
using namespace std;
#include <unistd.h>
#include <signal.h>
int flag=0;
void handler(int signo)
{flag=1;cout<<" signo is: "<<signo<<endl;
}
int main()
{signal(2,handler);while(!flag);cout<<"i am process !! process id:"<<getpid()<<endl;return 0;
}
编译器优化后cup没从内存读取flag不会运行下一句:
加上volatile后再编译运行:
cpu从内存中读取flag,循环条件判断失败,指向下一条语句;
四、基于信号方式的进程等待
4.1、当子进程退出时会给父进程发一个信号
我们捕获这个信号然后自定义处理方法去等待回收这个进程,而父进程继续做自己的事:
#include <sys/wait.h>
#include <iostream>
using namespace std;
#include <unistd.h>
void handler(int signo)
{pid_t id= waitpid(-1,nullptr,0);if(id>0){cout<<"waitprocess success!! process id:"<<id<<endl;}
}
int main()
{signal(2,handler);pid_t id=fork();if(id==0){//childcout<<"i am a child process ,process id is: "<<getpid()<<" ppid is:"<<getppid()<<endl;exit(0);}//fartherwhile(true){cout<<"i am farther process!!"<<endl;sleep(1);}return 0;
}
运行:
发送2号信号:
4.2 如果十个进程同时结束呢?或者结束一半后再结束另一半呢?
此时进程在正在执行信号处理方法,会把同信号屏蔽掉,那怎么办?
用循环非阻塞轮询:
一秒钟创建10个进程并处于僵尸状态:
发送2号信号:
成功回收完所有子进程!!
4.3 如果不需要获取子进程退出状态,不想自己等待的话,还有一个办法能让子进程退出时自动被回收掉
捕获17号信号(子进程结束时给父进程发送的信号),并把方法设置为SIG_IGN(忽略):
子进程被自动回收,监视窗口没有Z状态的进程,且只有一个父进程在跑:
今天的分享就到这里,如果对你有所帮助麻烦点赞收藏+关注哦!!谢谢!!!
咱下期见!!!
相关文章:
Linux 信号终篇(总结)
前文:本文是对信号从产生到被处理的过程中的概念和原理的总结,如果想了解具体实现,请查看前两篇博客:Linux 信号-CSDN博客、Linux 信号(下篇)-CSDN博客 一、信号的产生 1.1 信号产生的五种条件 ①键盘组…...
Springboot之会话技术
会话:用户打开浏览器,访问web服务器的资源,会话建立,直到有一方断开连接,会话结束。在一次会话中可以包含多次请求和响应。 会话跟踪:一种维护浏览器状态的方法,服务器需要识别多次请求是否来自于同一浏览器ÿ…...
数字信号处理|| 离散系统的冲激响应和阶跃响应
一、实验目的 (1)加深对离散线性移不变(LSI)系统基本理论的理解,明确差分方程与系统函数之间的关系。 (2)初步了解用MATLAB语言进行离散时间系统研究的基本方法。 (3)掌…...
JVM 数据区域
JVM 数据区域 1 程序计数器 程序计数器(Program Counter Register) ,也有称作为PC寄存器。在汇编语言中,程序计数器是指CPU中的寄存器,它保存的是程序当前执行的指令的地址,当CPU需要执行指令时࿰…...
MRNet 数据集分享
MRNet 数据集分享 包括了2001年1月1日至2012年12月31日期间在斯坦福大学医学中心进行的1370次膝关节MRI检查(平均年龄38.0岁;569例(41.5%)女性患者)。该数据集包含 1,104 (80.6%) 次异常检查,其中319 (23.…...
MCP项目实例 - client sever交互
1. 项目概述 项目目标 构建一个本地智能舆论分析系统。 利用自然语言处理和多工具协作,实现用户查询意图的自动理解。 进行新闻检索、情绪分析、结构化输出和邮件推送。 系统流程 用户查询:用户输入查询请求。 提取关键词:从用户查询中…...
uniapp|实现商品分类与列表数据联动,左侧菜单右侧商品列表(瀑布流、高度自动计算、多端兼容)
基于uniapp实现商品分类与商品列表数据联动,提供完整代码与常见问题解决方案,通过实战案例演示,快速构建商品列表交互,开箱即用。 目录 前言应用场景介绍页面布局与样式整体结构分析左侧菜单样式右侧商品列表样式核心功能实现数据绑定与渲染点击事件交互性能优化图片懒加载…...
1.2.2.1.4 数据安全发展技术发展历程:高级公钥加密方案——同态加密
引言 在密码学领域,有一种技术被图灵奖得主、著名密码学家Oded Goldreich誉为"密码学圣杯",那就是全同态加密(Fully Homomorphic Encryption)。今天我们就来聊聊这个神秘而强大的加密方案是如何从1978年的概念提出&…...
dify插件接入fastmcp示例
文章目录 1. 使用python完成mcp服务1.1 准备环境(python安装fastmcp)1.2 mcp服务端示例代码1.3 启动mcp服务端 2. dify接入2.1 安装MCP SSE和 Agent 策略(支持 MCP 工具) 插件2.2 dify agent插件配置mcp:2.3 mcp服务配置ÿ…...
从文本到语义:BERT、Faiss 与 Elasticsearch 的协同实践
从文本到语义:BERT、Faiss 与 Elasticsearch 的协同实践 在自然语言处理(NLP)的技术栈中,BERT、Faiss 和 Elasticsearch 是三个具有代表性的工具,它们各自发挥着独特的作用。BERT 负责文本的语义理解,Fais…...
安装或更新 CUDA Toolkit - Ubuntu - RuntimeError
1、问题 执行 pip install flash-attn --no-build-isolation 时,出错: RuntimeError: FlashAttention is only supported on CUDA 11.7 and above. Note: make sure nvcc has a torch.__version__ 2.4.0cu12 执行 nvcc --version 或 nvcc -V&…...
二、Hive安装部署详细过程
Apache Hive 是一个构建在 Hadoop 之上的数据仓库基础设施。它提供了类似 SQL 的查询语言 (称为 HiveQL 或 HQL),让熟悉 SQL 的开发人员和分析师能够轻松地查询和分析存储在 HDFS 或其他兼容存储系统中的大规模数据集。把结构化或半结构化的数据映射成表,…...
常见的降维算法
作业: 自由作业:探索下什么时候用到降维?降维的主要应用?或者让ai给你出题,群里的同学互相学习下。可以考虑对比下在某些特定数据集上t-sne的可视化和pca可视化的区别。 一、什么时候用到降维? 降维通常…...
Spring Boot 中如何启用 MongoDB 事务
在 Spring Boot 中启用和使用 MongoDB 事务主要依赖于以下几个方面: MongoDB 服务器和部署模式: MongoDB 版本 4.0 或更高版本才支持副本集 (Replica Set) 上的多文档 ACID 事务。MongoDB 版本 4.2 或更高版本才支持分片集群 (Sharded Cluster) 上的多文…...
2025年5月15日前 免费考试了! Oracle AI 矢量搜索专业认证
2025年5月5日前 免费考试了! Oracle AI 矢量搜索专业认证 立刻预约吧 文章目录 2025年5月5日前 免费考试了! Oracle AI 矢量搜索专业认证立刻预约吧🔍 探索 AI 向量搜索的强大功能!🎯 学习路径目标Ὦ…...
初等数论--莫比乌斯反演
1. 定义 假设 f ( n ) g ( n ) f(n)\ g(n) f(n) g(n)是定义在正整数上的两个函数 ,且 f ( n ) ∑ d ∣ n g ( d ) ∑ d ∣ n g ( n d ) f(n)\sum_{d|n}g(d)\sum_{d|n}g(\frac{n}{d}) f(n)d∣n∑g(d)d∣n∑g(dn) 那么 g ( n ) ∑ d ∣ n μ ( d ) f ( n d…...
访问者模式(Visitor Pattern)详解
文章目录 1. 访问者模式概述1.1 定义1.2 基本思想2. 访问者模式的结构3. 访问者模式的UML类图4. 访问者模式的工作原理5. Java实现示例5.1 基本实现示例5.2 访问者模式处理复杂对象层次结构5.3 访问者模式在文件系统中的应用6. 访问者模式的优缺点6.1 优点6.2 缺点7. 访问者模式…...
C++ 关联式容器:map,multimap,set,multiset
目录 引言 一、关联式容器概述 1.1 与序列式容器的区别 1.2 底层结构 二、set容器详解set介绍 2.1 set的特性 2.2 set的模板参数 2.3 set的常用接口 2.4 set使用示例 三、map容器详解map介绍 3.1 map的特性 3.2 map的模板参数 3.3 map的常用接口 3.4 map使用示例 …...
Discriminative and domain invariant subspace alignment for visual tasks
用于视觉任务的判别性和域不变子空间对齐 作者:Samaneh Rezaei,Jafar Tahmoresnezhad 文章于2018年12月4日收到,2019年5月24日被接受,2019年6月3日在线发表于Iran Journal of Computer Science期刊,DOI: 10.1007/s42…...
comfyui 如何优雅的从Hugging Face 下载模型,文件夹
如下图所示 使用git 下载整个仓库然后把需要的放到对应的位置...
【C++】 —— 笔试刷题day_27
一、kotori和气球 题目解析 这道题,有n中气球,每一种气球有无数多个;现在我们需要将这些气球摆成一排,但是,如果相邻的气球是相同的就会发生爆炸(也就是说,相同的气球相邻的摆法是不合法的&…...
2025年“深圳杯”数学建模挑战赛C题国奖大佬万字思路助攻
完整版1.5万字论文思路和Python代码下载:https://www.jdmm.cc/file/2712073/ 引言 本题目旨在分析分布式能源 (Distributed Generation, DG) 接入配电网系统后带来的风险。核心风险评估公式为: R P_{loss} \times C_{loss} P_{over} \times C_{over}…...
大模型微调指南之 LLaMA-Factory 篇:一键启动LLaMA系列模型高效微调
文章目录 一、简介二、如何安装2.1 安装2.2 校验 三、开始使用3.1 可视化界面3.2 使用命令行3.2.1 模型微调训练3.2.2 模型合并3.2.3 模型推理3.2.4 模型评估 四、高级功能4.1 分布训练4.2 DeepSpeed4.2.1 单机多卡4.2.2 多机多卡 五、日志分析 一、简介 LLaMA-Factory 是一个…...
游戏引擎学习第268天:合并调试链表与分组
回顾并为今天的内容设定基调 我们正在直播中开发完整的游戏,目前调试系统的开发已接近尾声。这个调试系统的构建过程经历了较长的时间,中间还暂停过一段时间去做硬件渲染路径的开发,并在已有的软件渲染路径基础上进行了扩展。后来我们又回到…...
【Linux系统编程】进程属性--标识符
1.PID 1.1什么是PID? 区分进程的唯一性 1.2如何查看进程? ps ajx | head -1 ; ps ajx | grep myproc 或者ps ajx | head -1 && ps ajx | grep myproc | grep -v grep(过滤掉grep本身这个进程) 1.3进程有哪两种&#…...
React文档-State数据扁平化
1、选择 State 结构 思考一下: 如果渲染列表, 并更新列表数据在下面展示~ state 过去常常是这样复制的: items [{ id: 0, title: pretzels}, ...]selectedItem {id: 0, title: pretzels} 改了之后是这样的:items [{ id: 0, …...
kotlin flow防抖
一 防抖设计 ✅ 1. 点击事件的防抖:用于防止频繁触发逻辑 🎯 适用场景: 用户连续快速点击按钮,可能会导致多次发送网络请求、CAN 指令或反复切换状态等副作用。所以我们通常在点击函数中处理防抖,例如: …...
基础语法(二)
Mysql基础语法(二) Mysql基础语法(二)主要介绍Mysql中稍微进阶一点的内容,会稍微有一些难度(博主个人认为)。学习完基础语法(一)和基础语法(二)之…...
FreeTex v0.2.0:功能升级/支持Mac
概述 FreeTex在发布之后,迎来很多反馈,本次根据主流的反馈建议,又进行一轮小升级,正式发布v0.2.0版本,主要升级点如下: 新增识别结果预览显示 Latex识别结果支持格式化输出 软件体积更小,并移…...
MacOS 用brew 安装、配置、启动Redis
MacOS 用brew 安装、配置、启动Redis 一、安装 brew install redis 二、启动 brew services start redis 三、用命令行检测 set name tom get name...
大型旋转机械信号分解算法模块
大型旋转机械信号分解算法模块,作为信号处理算法工具箱的主要功能模块,可应用于各类关键机械部件(轴承、齿轮、转子、联轴器等)的信号分析、故障探测、趋势劣化评估等,采用全Python语言,以B/S模式ÿ…...
Java 中的数据类型误导点!!!
在 Java 中,数据类型分为两大类:基本类型(Primitive Types) 和 引用类型(Reference Types)。它们的存储方式和行为完全不同。 1. 基本类型 Java 有 8 种基本数据类型,它们直接存储值ÿ…...
Linux--JsonCpp
1.JsonCpp 简介 JsonCpp 是一个用于 C 的 JSON 解析和生成库,支持 JSON 数据的读写、解析和序列化。它提供了简单的 API 来操作 JSON 对象、数组、字符串、数字等类型,是 C 开发中处理 JSON 数据的常用工具。 核心功能与类 JsonCpp 主要包含以下核心类…...
cv_connection (像halcon一样对区域进行打散)
主题: 分享一个自己用opencv写的小方法, 可以像halcon的connection算子一样, 对cv2.threshold得到的region进行打散, 并返回一个打散后的不相连的region的列表。 代码如下 def cv_connection(region):# he的拓扑信息为 后一…...
ConcurrentHashMap和锁
文章目录 JDK1.7的分段锁JDK1.8的volatileCAS synchronized可重入锁公平锁和非公平锁悲观锁和乐观锁 JDK1.7的分段锁 数据结构:数组(大数组 Segment 和小数组 HashEntry)链表 #mermaid-svg-dfSgz5E7tBmTbx14 {font-family:"trebuchet …...
黑马k8s(二)
集群环境搭建 1.环境规划 2.环境搭建-主机安装 主节点: 软件选择选择 基础设施服务器,这样安装系统完毕之后,会有很多软件我们可以直接使用了 系统点开,点一下完成 ip地址的设置:要跟虚拟网络编辑器,Net…...
LeetCode热题100--240.搜索二维矩阵--中等
1. 题目 编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性: 每行的元素从左到右升序排列。 每列的元素从上到下升序排列。 示例 1: 输入:matrix [[1,4,7,11,15],[2,5,8,12,19],[3,6,9,16,22],[1…...
python校园新闻发布管理系统
目录 技术栈介绍具体实现截图系统设计研究方法:设计步骤设计流程核心代码部分展示研究方法详细视频演示试验方案论文大纲源码获取/详细视频演示 技术栈介绍 Django-SpringBoot-php-Node.js-flask 本课题的研究方法和研究步骤基本合理,难度适中…...
Spring MVC 视图解析器 (ViewResolver) 如何配置? Spring Boot 是如何自动配置常见视图解析器的?
我们来详细分析一下视图解析器 (ViewResolver) 的配置以及 Spring Boot 是如何自动配置它们的。 视图解析器 (ViewResolver) 是什么? 在 Spring MVC 中,当控制器 (Controller) 方法处理完请求并返回一个逻辑视图名 (String) 时,DispatcherS…...
LeetCode 2918.数组的最小相等和:if-else
【LetMeFly】2918.数组的最小相等和:if-else 力扣题目链接:https://leetcode.cn/problems/minimum-equal-sum-of-two-arrays-after-replacing-zeros/ 给你两个由正整数和 0 组成的数组 nums1 和 nums2 。 你必须将两个数组中的 所有 0 替换为 严格 正…...
C++修炼:stack和queue
Hello大家好!很高兴我们又见面啦!给生活添点passion,开始今天的编程之路! 我的博客:<但凡. 我的专栏:《编程之路》、《数据结构与算法之美》、《题海拾贝》、《C修炼之路》 欢迎点赞,关注&am…...
欧拉计划 Project Euler 69(欧拉总计函数与最大值)题解
欧拉计划 Project Euler 69 题解 题干欧拉总计函数与最大值 思路code 题干 欧拉总计函数与最大值 小于 n n n且与 n n n互质的正整数的数量记为欧拉总计函数 φ ( n ) \varphi(n) φ(n),例如, 1 、 2 、 4 、 5 、 7 1、2、4、5、7 1、2、4、5、7和 8 …...
TCP Socket编程
最基本的Socket编程 想客户端和服务器能在网络中通信,就得使用 Socket 编程,它可以进行跨主机间通信。在创建Socket时可以选择传输层使用TCP还是UDP。相对于TCP来说,UDP更为简单,下面以TCP为例。 TCP服务端要先建立起来…...
[CLS] 向量是 BERT 类模型中一个特别重要的输出向量,它代表整个句子或文本的全局语义信息
[CLS] 向量是 BERT 类模型中一个特别重要的输出向量,它代表整个句子或文本的全局语义信息。 ✅ 什么是 [CLS] 在 BERT 模型中,每条输入前会加一个特殊的 token:[CLS](classification 的缩写)。这个 token 没有具体语义…...
47.电压跌落与瞬时中断干扰的防护改善措施
电压跌落与瞬时中断干扰的防护改善措施 1. 电压跌落与瞬时中断的影响机理2. 解决措施 1. 电压跌落与瞬时中断的影响机理 跌落发生的常见场景如下: (1)电源插头接触不良,瞬态中断即刻恢复; (2)电…...
LeetCode热题100 两数之和
目录 两数之和题目解析方法一暴力求解代码 方法二哈希代码 感谢各位大佬对我的支持,如果我的文章对你有用,欢迎点击以下链接 🐒🐒🐒 个人主页 🥸🥸🥸 C语言 🐿️🐿️🐿…...
【无标题】I/O复用(epoll)三者区别▲
一、SOCKET-IO复用技术 定义:SOCKET - IO复用技术是一种高效处理多个套接字(socket)的手段,能让单个线程同时监听多个文件描述符(如套接字)上的I/O事件(像可读、可写、异常)&#x…...
【数据结构】子串、前缀
子串 (Substring) 字符串中连续的一段字符序列,例如 "abc" 是 "abcd" 的子串。 特点:必须连续,顺序不可改变。 子序列 (Subsequence) 字符串中不连续但保持顺序的字符序列,例如 "acd" 是 "…...
[docker基础四]容器虚拟化基础之 LXC
目录 一 认识LXC 二 LXC容器操作实战 1)实战目的 2)基础知识 lxc-checkconfig lxc-create lxc-start lxc-ls lxc-info lxc-attach lxc-stop lxc-destory 3)安装LXC(我的是Ubuntu) 4)操作实战 1. 检查 lxc 是否运行…...
leetcode 2918. 数组的最小相等和 中等
给你两个由正整数和 0 组成的数组 nums1 和 nums2 。 你必须将两个数组中的 所有 0 替换为 严格 正整数,并且满足两个数组中所有元素的和 相等 。 返回 最小 相等和 ,如果无法使两数组相等,则返回 -1 。 示例 1: 输入…...