linux-进程信号的产生
Linux中的进程信号(signal)是一种用于进程间通信或向进程传递异步事件通知的机制。信号是一种软中断,用于通知进程某个事件的发生,如错误、终止请求、计时器到期等。
1. 信号的基本概念
- 信号(Signal):是一种异步通知机制,当内核或其他进程需要通知某个进程发生了某种事件时,会向该进程发送一个信号。进程接收到信号后,可以根据预设的处理方式进行响应。
- 默认处理:每种信号都有默认的处理动作,比如终止、忽略、停止或继续执行。
- 捕捉信号:进程可以通过注册信号处理函数(signal handler)来捕捉信号,从而自定义对信号的响应。
查看信号 kill -l
1~31为普通信号。34~64为实时信号。
实时信号需要立即处理,可以不立即处理的是普通信号。
怎么进行信号处理?a.默认处理 b.忽略处理 c.自定义处理, 都叫做信号捕捉。
#include <iostream>
#include <unistd.h>
int main()
{while(true){std::cout << "I am a process, I am waiting signal!" << std::endl;sleep(1);}
}

个系统调用函数。
signal:用于设置对特定信号的处理方式
signum:要处理的信号编号[只需要知道是数字即可]
handler:函数指针,表示更改信号的处理动作,当收到对应的信号,就回调执行handler方法。
#include <iostream>
#include <unistd.h>
#include <signal.h>
void handler(int signumber)
{std::cout << "我是: " << getpid() << ", 我获得了⼀个信号: " << signumber <<std::endl;
}
int main()
{std::cout << "我是进程: " << getpid() << std::endl;signal(SIGINT/*2*/, handler);while(true){std::cout << "I am a process, I am waiting signal!" << std::endl;sleep(1);}
}
这里重定义了二号信号的处理方式,二号信号默认处理是终止进程
2. 信号的产生
在 Linux 中,信号(Signal)是进程间通信(IPC)和异常处理的重要机制。信号的产生方式主要包括 硬件事件、软件命令 和 内核机制 触发。
2.1 硬件事件触发信号
当发生硬件异常时,操作系统会向相应的进程发送信号,例如:
非法操作:程序执行非法指令,如除零 (SIGFPE
)、访问非法内存 (SIGSEGV
)。
键盘输入:用户在终端输入 Ctrl+C
或 Ctrl+Z
,分别产生 SIGINT
(中断进程)和 SIGTSTP
(暂停进程)。
硬件事件 | 触发的信号 |
---|---|
除零错误 | SIGFPE |
非法内存访问 | SIGSEGV |
非法指令 | SIGILL |
总线错误 | SIGBUS |
用户按 Ctrl+C | SIGINT |
用户按 Ctrl+Z | SIGTSTP |
进程访问非法地址触发 SIGSEGV
访问 NULL
指针或越界访问内存,会触发 SIGSEGV(段错误)
遇到除0错误
触发八号信号SIGFPE
2.2 系统调用触发信号
发送信号的本质是相进程写信号,通过进程的pid和信号编号修改位图(本质是OS修改内核的数据)。
用户或进程可以使用 命令 或 系统调用 产生信号。
2.2.1 使用 kill
命令
kill
可用于向指定进程发送信号。例如:
kill -SIGTERM 1234 # 向进程 1234 发送 SIGTERM(终止进程)
kill -9 1234 # 等同于 kill -SIGKILL 1234,强制终止进程
kill -STOP 1234 # 暂停进程
kill -CONT 1234 # 继续运行被暂停的进程
其中:
SIGTERM(15):请求终止进程,进程可捕获并决定是否退出(默认 kill 发送的信号)。
SIGKILL(9):强制终止进程,进程无法捕获,立即终止。
SIGSTOP(19):暂停进程,类似 Ctrl+Z,进程无法忽略。
SIGCONT(18):恢复暂停的进程。
2.2.2 使用 kill()
系统调用
在 C 语言中,kill()
可以向指定进程发送信号:
#include <signal.h>
#include <unistd.h>int main() {pid_t pid = 1234; // 目标进程的 PIDkill(pid, SIGTERM); // 发送 SIGTERM 终止进程return 0;
}
//mykill.c
#include <iostream>
#include <sys/types.h>
#include <signal.h>
#include <string>int main(int argc, char *argv[])
{if(argc != 3){std::cout << "./mykill signum pid" << std::endl;return 1;}pid_t target = std::stoi(argv[2]);int signum = std::stoi(argv[1]);int n = kill(target, signum);if(n == 0){std::cout << "Send " << signum << " to " << target << std::endl;}return 0;
}
//testsig.cc
#include <iostream>
#include <signal.h>void handler(int signum)
{std::cout << "i get a signal: " << signum << std::endl;
}
int main()
{signal(SIGINT, handler);while(true){std::cout << "i am a process, pid: " << getpid() << std::endl;sleep(1);}return 0;
}
2.2.3 使用 raise()
让当前进程向自己发送信号
#include <iostream>
#include <signal.h>void handler(int signum)
{std::cout << "i get a signal: " << signum << std::endl;
}
int main()
{signal(SIGINT, handler);//捕捉信号for(int i = 1; i < 32; i++)signal(i, handler);for(int i = 1; i < 32; i++){sleep(1);raise(i);}return 0;
}
信号 9 也就是 SIGKILL
信号,它是一个强制终止信号,并且不可被捕获、阻塞或忽略的,也就无法对其进行修改和自定义。
2.2.4 abort
abort用于异常终止进程,并生成核心转储(core dump),以便调试程序崩溃的原因。
#include <stdlib.h>void abort(void);无参数,直接终止当前进程
不会返回,进程立即结束
默认产生 SIGABRT 信号,导致进程终止并生成 core dump(如果系统允许)
abort()
与 exit()
的区别
abort() | exit() | |
---|---|---|
终止方式 | 发送 SIGABRT ,可能生成 core dump | 正常终止 |
释放资源 | 不执行 atexit() 注册的函数 | 执行 atexit() 注册的清理函数 |
可捕获 | 可通过 signal(SIGABRT, handler) 处理 | 不发送信号 |
适用场景 | 程序遇到致命错误时终止 | 正常退出,返回状态码 |
捕获SIGABRT
#include <iostream>
#include <signal.h>void handler(int signum)
{std::cout << "i get a signal: " << signum << std::endl;
}
int main()
{signal(SIGABRT, handler);printf("before pause\n");abort();printf("after pause\n");return 0;
}
2.3 软件命令触发信号
2.3.1 使用 alarm()
触发 SIGALRM
alarm()
是一个用于设置定时器的系统调用,它会在指定的秒数后向进程发送 SIGALRM
信号,从而触发相应的信号处理函数或终止进程。
函数原型:
#include <unistd.h>
unsigned int alarm(unsigned int seconds);seconds:设置的定时秒数。
返回值:返回上一个 alarm() 调用设置的剩余时间(如果没有,则返回 0)。
alarm(0):取消闹钟
alarm()
只能设置一个定时器,如果在定时器未触发前再次调用 alarm()
,则前一个定时器会被覆盖。
#include <iostream>
#include <signal.h>void handler(int signum)
{std::cout << "i get a signal: " << signum << std::endl;
}
int main()
{signal(SIGINT, handler);alarm(3);int cnt = 0;while(true){std::cout << "i am a process " << cnt++ << " pid: " << getpid() << std::endl;sleep(1);}return 0;
}
2.3.2 pause()
pause 是一个系统调用,它使进程挂起(阻塞),直到接收到信号(且该信号的处理方式不是忽略)。它通常与 signal()
或 sigaction()
结合使用,以等待某个特定信号的到来。
函数原型:
#include <unistd.h> int pause(void);返回值:通常不返回,除非被信号中断,此时返回 -1,并设置 errno 为 EINTR(被信号中断的错误)。
#include <iostream>
#include <signal.h>void handler(int signum)
{std::cout << "i get a signal: " << signum << std::endl;
}
int main()
{signal(SIGALRM, handler);alarm(3);printf("before pause\n");pause();printf("after pause\n");return 0;
}
2.3.3 设置重复闹钟
#include <iostream>
#include <signal.h>
#include <vector>
#include <functional>
#include <unistd.h>using func_t = std::function<void()>;
std::vector<func_t> funcs;void Schel()
{std::cout << "我是进程调度" << std::endl;
}
void MemManger()
{std::cout << "我是周期性的内存管理, 正在检查有没有内存问题" << std::endl;
}
void Fflush()
{std::cout << "我是刷新程序,定期刷新内存数据" << std::endl;
}
void handler(int signum)
{gcount++;std::cout << "###################" << std::endl;for(auto &f : funcs)f();std::cout << "###################" << std::endl;int n = alarm(1);std::cout << gcount << std::endl;
}
int main()
{funcs.push_back(Schel);funcs.push_back(MemManger);funcs.push_back(Fflush);signal(SIGALRM, handler);alarm(1);while(true)pause();return 0;
}
alarm内核数据结构
struct timer_list {struct list_head entry; //将 timer_list 结构体组织成链表unsigned long expires; //表示定时器的超时时间void (*function)(unsigned long); //指向回调函数的指针,当定时器超时后,内核会调用该函数。unsigned long data; //作为 function 回调函数的参数,通常用于传递自定义数据。struct tvec_t_base_s *base;
};
2.4 内核触发信号
Linux 内核在特定情况下会向进程发送信号,例如:
2.4.1 进程终止时,父进程收到 SIGCHLD
子进程终止后,父进程会收到 SIGCHLD
,可用于回收子进程资源:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>void child_handler(int signum) {printf("Child process exited.\n");
}int main() {signal(SIGCHLD, child_handler);if (fork() == 0) {printf("Child process running...\n");sleep(2);exit(0);}pause(); // 等待信号return 0;
}
(2)磁盘 I/O 错误触发 SIGBUS
访问未映射的内存或硬件错误会触发 SIGBUS
。
(3)后台进程写入终端触发 SIGHUP
后台进程尝试写入终端时,可能收到 SIGHUP
,表示挂起(通常用于会话管理)。
2.4 信号的分类
Linux 信号可分为 终止信号、忽略信号、暂停信号 和 核心转储信号。
类别 | 常见信号 |
---|---|
终止信号 | SIGTERM 、SIGKILL 、SIGINT 、SIGHUP |
暂停信号 | SIGSTOP 、SIGTSTP 、SIGCONT |
核心转储信号 | SIGSEGV 、SIGILL 、SIGABRT |
忽略信号 | SIGCHLD 、SIGURG |
SIGTERM (15):终止信号,用于请求进程正常终止,允许进程进行清理工作后退出。
SIGKILL (9):强制杀死进程的信号,无法被捕捉或忽略,立即终止进程。
SIGSTOP:暂停进程的执行,无法被捕捉或忽略。
SIGCONT:使处于暂停状态的进程继续运行。
SIGHUP (1):挂起信号,常用于通知进程重新读取配置文件或重启。
SIGALRM:定时器信号,定时器到期时发出,用于处理超时操作。
man 7 siganl
Core(终止),Term(终止),Cont(继续),Stop(暂停),Ign(忽略)
信号 vs 通信IPC:
(1)信号是用户和OS,IPC是用户之间
(2)信号是OS修改内核数据结构,IPC是写到缓冲区中
3.目标进程
前台进程是指 直接与终端交互 的进程,用户可以通过 键盘输入 来控制它。
后台进程指的是 不直接与终端交互,在后台运行的进程,用户可以继续在终端执行其他操作。
假如有一个可执行程序code:
./code -> 前台进程
./code & -> 后台进程
命令行shell进程是前台进程。
- 后台进程无法从标准输入获取内容,前台可以。但是都可以向标准输出打印内容。
- 前台进程只能有一个,后台进程可以有多个。
在上图中,testcode
进程成为了前台进程,因此当我们在终端输入 ls
命令时,并未在屏幕上看到输出。这是因为此时命令行 Shell 进程已切换到后台,而 testcode
进程本身 并未提供执行 ls
等命令的接口,导致输入的命令无法被正确解析和执行。
在上述代码中,testcode
进程虽然在标准输出上打印内容,但它是 后台进程,而 前台进程仍然是 Shell 进程。因此,当用户在终端输入 ls
等命令时,Shell 进程能够正常接收输入并执行相应命令,输出也会正确显示在终端上。
几个命令:
jobs查看所有的后台任务
fg(frontground)任务号,将特定的进程提到前台
ctrl + z:将进程暂停。前台进不能被暂停,如果对前台进程使用ctrl+z,该进程会被自动提到后台。
bg:让后台进程回复运行
相关文章:
linux-进程信号的产生
Linux中的进程信号(signal)是一种用于进程间通信或向进程传递异步事件通知的机制。信号是一种软中断,用于通知进程某个事件的发生,如错误、终止请求、计时器到期等。 1. 信号的基本概念 - 信号(Signal)&am…...
基于 Nexus 在 Dockerfile 配置 yum, conda, pip 仓库的方法和参考
在 Nexus 配置代理仓库的方法,可参考 pypi 的配置博客:https://hellogitlab.com/CI/docker/create_your_nexus_2 更多代理格式,参考官方文档,如 pypi:https://help.sonatype.com/en/pypi-repositories.html 配置 yum…...
精品可编辑PPT | 全面风险管理信息系统项目建设风控一体化标准方案
这份文档是一份全面风险管理信息系统项目建设风控一体化标准方案,涵盖了业务架构、功能方案、系统技术架构设计、项目实施及服务等多个方面的详细内容。方案旨在通过信息化手段提升企业全面风险管理工作水平,促进风险管理落地和内部控制规范化࿰…...
Redis集群安装
Redis集群安装 1.集群介绍 首先要了解,Redis的高可用机制。 2个master节点,挂掉1个,1不过半,则集群宕机,不可用,容错率为0;3个master节点,挂掉1个,2>1,…...
下载知网外文文献全文的方法
知网和一些外文数据库机构是合作关系,因知网没有订购外文文献全文,所以可以搜到外文文献但不能下载全文,基本提供的都是外文文献摘要。本文就实例演示一下获取知网外文文献全文的方法步骤。 例如下面这篇知网外文文献,该文献被收…...
解决IDEA无法运行git的问题
之前git一直没有问题,今天打开就提示我安装git,自然用git去提交新项目也会遇到问题。 我出现问题的原因是:git路径缺失 文件->设置->git 发现git的路径为空,按照实际位置填写即可...
基于Qt6 + MuPDF在 Arm IMX6ULL运行的PDF浏览器——MuPDF Adapter文档
项目地址:总项目Charliechen114514/CCIMXDesktop: This is a Qt Written Desktop with base GUI Utilities 本子项目地址:CCIMXDesktop/extern_app/pdfReader at main Charliechen114514/CCIMXDesktop 前言 这个部分说的是Mupdf_adaper下的文档的工…...
Ubuntu20.04 搭建Kubernetes 1.28版本集群
环境依赖 以下操作,无特殊说明,所有节点都需要执行 安装 ssh 服务安装 openssh-server复制代码 sudo apt-get install openssh-server修改配置文件复制代码 vim /etc/ssh/sshd_config找到配置项 复制代码 LoginGraceTime 120 PermitRootLogin prohibit-password StrictModes…...
操作系统和数据库账号密码的安全管理、使用,安当SMS凭据管理系统
引言:密码管理困局下的破局之道 在数字化转型的深水区,企业正面临前所未有的密码管理挑战。某跨国制造企业因数据库密码泄露导致核心工艺参数外泄,某三甲医院因运维账号滥用引发百万级医疗数据泄露事件,这些真实案例揭示着传统密…...
Java设计模式之代理模式:从入门到精通(保姆级教程)
1. 代理模式概述 代理模式(Proxy Pattern)是一种结构型设计模式,它为其他对象提供一种代理以控制对这个对象的访问。代理对象在客户端和目标对象之间起到中介作用,可以在不改变目标对象代码的情况下增加额外的功能。 1.1 专业概念解释 代理模式:为其他对象提供一种代理…...
单片机-STM32部分:13-1、蜂鸣器
飞书文档https://x509p6c8to.feishu.cn/wiki/V8rpwIlYIiEuXLkUljTcXWiKnSc 一、应用场景 大部分的电子产品、家电(风扇、空调、电水壶)都会有蜂鸣器,用于提示设备的工作状态 二、原理 蜂鸣器是一种将电信号转换为声音信号的器件࿰…...
JVM——方法内联
引入 在现代软件开发中,性能优化始终是一个关键课题。随着硬件架构的不断演进,CPU的主频提升逐渐放缓,而软件复杂度却持续增加,这使得编译器优化技术的重要性日益凸显。方法内联(Method Inlining)作为编译…...
C++类成员
一、内联函数(Inline Functions) 作用 解决频繁调用小函数时的栈内存消耗问题,通过将函数代码直接插入调用点,避免压栈/出栈开销。 定义形式 inline 返回类型 函数名(参数列表) { ... }• 隐式声明:类内直接定义的成员…...
SpringBoot校园失物招领信息平台
SpringBoot校园失物招领信息平台 文章目录 SpringBoot校园失物招领信息平台1、技术栈2、项目说明2.1、登录注册2.2、管理员端截图2.3、用户端截图 3、核心代码实现3.1、前端首页3.2、前端招领广场3.3、后端业务处理 1、技术栈 本项目采用前后端分离的架构,前端和后…...
代码随想录算法训练营第三十八天
LeetCode题目: 1143. 最长公共子序列1035. 不相交的线53. 最大子数组和392. 判断子序列2094. 找出 3 位偶数(每日一题) 其他: 今日总结 往期打卡 1143. 最长公共子序列 跳转: 1143. 最长公共子序列 学习: 代码随想录公开讲解 问题: 给定两个字符串 text1 和 text2࿰…...
Nginx stream模块是连接级别的负载均衡
在Nginx的stream模块中,upstream的权重配置实现的是连接级别的负载均衡,这和http模块不同。 当客户端发起一个新的TCP连接时,Nginx根据各upstream的权重值选择其中一个upstream建立连接,之后该连接上的所有数据传输都由这个upstre…...
贝叶斯算法
贝叶斯算法是一类基于贝叶斯定理的机器学习算法,它们在分类任务中表现出色,尤其在处理具有不确定性和 probabilistic 关系的数据时具有独特优势。本文将深入探讨贝叶斯算法的核心原理、主要类型以及实际应用案例,带你领略贝叶斯算法在概率推理…...
计算机网络:CPU与时钟的关系
在计算机中,CPU(中央处理器)与时钟的关系是核心且密不可分的。时钟信号是驱动CPU运行的“心跳”,决定了计算机执行指令的节奏和协调性。以下是两者的关键关系及作用: 1. 时钟信号:CPU的“节拍器” 时钟频率(Clock Speed) CPU的时钟频率(如3.5 GHz)表示每秒的时钟周期…...
java中强引用、软应用、弱应用、虚引用
在Java中,引用类型决定了对象的生命周期和垃圾回收的时机。Java提供了四种不同的引用类型:强引用、软引用、弱引用和虚引用。每种引用类型的行为和用途不同,了解这些差异对优化内存管理和垃圾回收非常重要。 1. 强引用(Strong Re…...
分析红黑树工程实用的特点
🧭 本节目标 理解红黑树在工程中的优劣势对比红黑树与其他数据结构(AVL 树、跳表、哈希表等)分析红黑树为何成为内核级应用(如 Linux CFS、内存管理)首选总结红黑树工程上的典型使用建议 一、红黑树工程级使用的主要特…...
C/C++ 内存管理深度解析:从内存分布到实践应用(malloc和new,free和delete的对比与使用,定位 new )
一、引言:理解内存管理的核心价值 在系统级编程领域,内存管理是决定程序性能、稳定性和安全性的关键因素。C/C 作为底层开发的主流语言,赋予开发者直接操作内存的能力,却也要求开发者深入理解内存布局与生命周期管理。本文将从内…...
如何使用主机名在 CMD 中查找 IP 地址?
在网络中,每个系统都有一个由几位数字组成的唯一标识,称为 IP 地址。然而,记住它们可能是一项艰巨的任务,尤其是当系统数量众多时。例如,互联网上运行的每个网站都有一个 IP 地址,以便其他系统在需要时可以调用它们,但你认为记住我们访问的每个网站的长串数字是可行的吗…...
解读RTOS:第二篇 · 线程/任务管理与调度策略
1. 引言 在 RTOS 中,线程(Task)是最基本的执行单元,它封装了应用功能、资源使用和优先级属性。任务管理与调度策略决定了系统在多任务场景下的响应速度、资源分配效率与实时性保证。理解并掌握任务创建、状态转换、优先级设计和调度算法,是 RTOS 应用开发的核心内容。 2…...
linux下minio的进程管理脚本
准备工作: 参考链接: Deploy MinIO: Single-Node Single-Drive — MinIO Object Storage for Linux 下载: wget https://dl.min.io/server/minio/release/linux-amd64/minio kill-app.sh #!/bin/bash # 文件名: kill-app.sh…...
论文学习_A Survey of Binary Code Similarity
摘要:二进制代码相似性方法的主要目的是比较两个或多个二进制代码片段,以识别它们之间的相似性与差异(研究背景)。由于在许多实际场景中源代码往往不可获取,因此具备比较二进制代码的能力显得尤为重要,例如…...
python标准库--sys - 系统相关功能在算法比赛的应用
目录 1. 快速输入输出 2. 调整递归深度限制 1. 快速输入输出 算法比赛中,大量数据的读写可能成为瓶颈。sys.stdin和sys.stdout比内置的input()和print()效率更高。 import sys# 读取多行输入(每行一个整数) n int(sys.stdin.readline()) …...
运算放大器相关的电路
1运算放大器介绍 解释:运算放大器本质就是一个放大倍数很大的元件,就如上图公式所示 Vp和Vn相差很小但是放大后输出还是会很大。 运算放大器不止上面的三个引脚,他需要独立供电; 如图比较器: 解释:Vp&…...
进程和线程
目录 1. 基本定义 2. 核心区别 3. 优缺点对比 进程和线程是操作系统中用于实现并发执行的两个核心概念,它们既有相似之处,又有明显的区别。下面从多个维度对它们进行对比分析: 1. 基本定义 进程(Process) 进程是程…...
生成对抗网络(GAN)深度解析:理论、技术与应用全景
生成对抗网络(Generative Adversarial Networks,GAN)作为深度学习领域的重要突破,通过对抗训练框架实现了强大的生成能力。本文从理论起源、数学建模、网络架构、工程实现到行业应用,系统拆解GAN的核心机制,涵盖基础理…...
Java面试全记录:Spring Cloud+Kafka+Redis实战解析
Java面试全记录:Spring CloudKafkaRedis实战解析 人物设定 姓名:张伟(随机生成唯一姓名) 年龄:28岁 学历:硕士 工作年限:5年 工作内容: 基于Spring Cloud搭建微服务架构使用Kafka…...
人脸识别deepface相关笔记
人脸识别deepface相关笔记 项目地址项目结构 项目地址 https://github.com/serengil/deepface.git 项目结构...
量子加密通信:守护信息安全的未来之盾
摘要 在数字化时代,信息安全成为全球关注的焦点。传统加密技术面临着被量子计算破解的风险,而量子加密通信作为一种基于量子力学原理的新型加密技术,提供了理论上无条件安全的通信保障。本文将详细介绍量子加密通信的基本原理、技术实现、应用…...
三、transformers基础组件之Model
1. 什么是Model Head Model Head 是连接在模型后的层,通常为1个或多个全连接层Model Head 将模型的编码的表示结果进行映射,以解决不同类型的任务 不同的任务会有不同的Model Head。 2. 模型加载 2.1 在线加载 预训练模型的加载与Tokenizer类似,我们只需要指定想…...
【语法】C++的多态
目录 虚函数的重写: 虚函数 重写(覆盖) 虚函数重写的两个例外: 协变: 析构函数的重写: 练习: final和override关键字 抽象类 接口继承和实现继承 虚函数重写的原理: 打印虚函数表: …...
WebGIS开发新突破:揭秘未来地理信息系统的神秘面纱
你有没有想过,未来的地理信息系统(GIS)会是什么样子?是像电影里那样,一块透明屏幕就能呈现整个城市的实时动态?还是像《钢铁侠》中那样,一个手势就能操控全球地图? 其实,…...
JVM类加载
JVM类加载 1. 类的生命周期(类加载过程)类加载的五个阶段: 2. 类加载器的分类3. 双亲委派模型4. 类的卸载与热加载5.类加载器命名空间隔离 1. 类的生命周期(类加载过程) 类加载的五个阶段: 加载ÿ…...
AD开启交叉选择功能,只选中器件,不选中网络、焊盘
AD开启交叉选择功能,只选中器件,不选中网络、焊盘。 一、打开首选项 二、打开System→Navigationg,配置如下。 三、最后点击OK即可。...
机器学习——集成学习基础
一、鸢尾花数据训练模型 1. 使用鸢尾花数据分别训练集成模型:AdaBoost模型,Gradient Boosting模型 2. 对别两个集成模型的准确率以及报告 3. 两个模型的预测结果进行可视化 需要进行降维处理,两个图像显示在同一个坐标系中 代码展示&…...
C++匿名函数
C 中的匿名函数(Lambda 表达式)是 C11 引入的一项重要特性,它允许你在需要的地方定义一个临时的、无名的函数对象,使代码更加简洁和灵活。 1. 基本语法 Lambda 表达式的基本结构: [capture list](parameter list) -…...
互联网大厂Java面试实战:Spring Boot到微服务的技术问答解析
💪🏻 1. Python基础专栏,基础知识一网打尽,9.9元买不了吃亏,买不了上当。 Python从入门到精通 😁 2. 毕业设计专栏,毕业季咱们不慌忙,几百款毕业设计等你选。 ❤️ 3. Python爬虫专栏…...
神经网络是如何工作的
人工智能最核心的技术之一,就是神经网络(Neural Networks)。但很多初学者会觉得它是个黑盒:为什么神经网络能识别图片、翻译语言,甚至生成文章? 本文用图解最小代码实现的方式,带你深入理解&am…...
Kubernetes控制平面组件:Kubelet详解(二):核心功能层
云原生学习路线导航页(持续更新中) kubernetes学习系列快捷链接 Kubernetes架构原则和对象设计(一)Kubernetes架构原则和对象设计(二)Kubernetes架构原则和对象设计(三)Kubernetes控…...
【android bluetooth 框架分析 02】【Module详解 13】【CounterMetrics 模块介绍】
1. CounterMetrics 介绍 CounterMetrics 模块代码很少, 我简单介绍一下。 // system/gd/metrics/counter_metrics.cc #define LOG_TAG "BluetoothCounterMetrics"#include "metrics/counter_metrics.h"#include "common/bind.h" #i…...
Matlab自学笔记五十四:符号数学工具箱和符号运算、符号求解、绘图
1.什么是符号数学工具箱? 符号数学工具箱是Matlab针对符号对象的运算功能,它引入了一种特殊的数据类型 - 符号对象; 该数据类型包括符号数字,符号变量,符号表达式和符号函数,还包含符号矩阵,以…...
Matlab 模糊控制平行侧边自动泊车
1、内容简介 Matlab 233-模糊控制平行侧边自动泊车 可以交流、咨询、答疑 2、内容说明 略 3、仿真分析 略 4、参考论文 略...
新书速览|纯血鸿蒙HarmonyOS NEXT原生开发之旅
《纯血鸿蒙HarmonyOS NEXT原生开发之旅》 本书内容 《纯血鸿蒙HarmonyOS NEXT原生开发之旅》全面系统地介绍了基于HarmonyOS NEXT系统进行原生应用开发的实用技巧。全书共12章,内容涵盖从基础工具使用到高级功能实现的各个方面。第1章详细介绍了开发环境的搭建、Ar…...
tinyint(3)数据类型讲解
TINYINT(3) 是数据库中用于定义字段数据类型的一种写法,常见于 MySQL 等数据库系统。下面来详细了解其含义和作用: 数据类型本质 TINYINT 属于整数类型,在不同的数据库系统中,它所占用的存储空间和表示范围通常是固定的。以 MyS…...
manjaro系统详解
1. Manjaro 概述 Manjaro 是一款基于 Arch Linux 的滚动更新发行版,以 用户友好、易用性 和 硬件兼容性 为核心设计理念。它继承了 Arch 的灵活性和软件丰富性,同时通过图形化工具和稳定的更新策略降低了使用门槛,适合从新手到高级用户的广泛…...
# 实时英文 OCR 文字识别:从摄像头到 PyQt5 界面的实现
实时英文 OCR 文字识别:从摄像头到 PyQt5 界面的实现 引言 在数字化时代,文字识别技术(OCR)在众多领域中发挥着重要作用。无论是文档扫描、车牌识别还是实时视频流中的文字提取,OCR 技术都能提供高效且准确的解决方案…...
9.3.云原生架构模式
目录 一、云原生架构核心概念 云原生定义与核心原则 • 四大核心要素:容器化、微服务、DevOps、持续交付 • 核心原则:弹性、可观测性、自动化、不可变基础设施 云原生技术矩阵 • 容器与编排:Docker、Kubernetes、CRI-O • 服务治理&#…...