Linux信号机制:从入门到精通
嘿,小伙伴们!今天我要和大家聊一个Linux系统中非常有趣又重要的话题——信号机制。别担心,虽然信号听起来有点高深,但我会用最通俗易懂的语言,配合清晰的图表,带你彻底搞懂这个概念!
什么是信号?
想象一下,如果你正在专心写代码,突然有人拍了一下你的肩膀,这就类似于操作系统中的"信号"。信号是Linux系统中用于通知进程发生了某种事件的一种异步通信机制,就像操作系统给进程发送的"紧急短信"。
信号的本质是软件中断,当进程收到信号后,会暂停当前工作,转而去处理这个信号,处理完后再回到原来的工作。这就像你接到一个紧急电话,处理完紧急事务后再回到之前的工作一样。
为什么需要信号?
在Linux系统中,信号主要用于以下几个场景:
- 错误处理:当程序出现严重错误(如除零、非法内存访问)时,系统会发送相应信号
- 终止进程:用户可以通过按下Ctrl+C发送SIGINT信号来终止前台进程
- 进程间通信:一个进程可以通过信号通知另一个进程发生了某事
- 定时器功能:通过SIGALRM信号实现定时器功能
- 状态变化通知:如子进程终止时,父进程会收到SIGCHLD信号
Linux信号的种类
Linux系统定义了多种信号,每种信号都有特定的用途。以下是一些常见的信号:
信号名称 | 信号值 | 默认动作 | 描述 |
---|---|---|---|
SIGHUP | 1 | 终止 | 终端断开连接 |
SIGINT | 2 | 终止 | 键盘中断(Ctrl+C) |
SIGQUIT | 3 | 终止 + core | 键盘退出(Ctrl+\) |
SIGILL | 4 | 终止 + core | 非法指令 |
SIGTRAP | 5 | 终止 + core | 断点陷阱 |
SIGABRT | 6 | 终止 + core | 调用 abort 函数 |
SIGFPE | 8 | 终止 + core | 浮点异常 |
SIGKILL | 9 | 终止 | 强制终止(不可捕获) |
SIGSEGV | 11 | 终止 + core | 段错误(无效内存引用) |
SIGPIPE | 13 | 终止 | 管道破裂 |
SIGALRM | 14 | 终止 | 定时器到期 |
SIGTERM | 15 | 终止 | 终止信号(kill 命令默认) |
SIGUSR1 | 10 | 终止 | 用户自定义信号 1 |
SIGUSR2 | 12 | 终止 | 用户自定义信号 2 |
SIGCHLD | 17 | 忽略 | 子进程状态改变 |
SIGCONT | 18 | 继续 | 继续执行被停止的进程 |
SIGSTOP | 19 | 停止 | 停止进程(不可捕获) |
SIGTSTP | 20 | 停止 | 键盘停止(Ctrl+Z) |
信号的生命周期
信号的生命周期包括三个阶段:产生、未决和处理。
1. 信号的产生
信号可以通过多种方式产生:
2. 信号的未决状态
当信号产生后,会进入未决状态,等待被处理。如果此时该信号被阻塞(blocked),则会保持未决状态,直到解除阻塞。
3. 信号的处理
当信号递达(delivered)到进程后,进程会根据信号处理方式来响应:
- 默认处理:每个信号都有默认动作,如终止进程、忽略信号等
- 忽略信号:进程可以选择忽略某些信号(但SIGKILL和SIGSTOP不能被忽略)
- 捕获信号:进程可以注册自定义的信号处理函数
信号处理的编程实践
注册信号处理函数
在C/C++中,我们可以使用signal()或更强大的sigaction()函数来注册信号处理函数:
#include <signal.h>// 信号处理函数void signal_handler(int signum) {printf("捕获到信号 %d\n", signum);// 处理信号的代码}int main() {// 注册SIGINT信号的处理函数signal(SIGINT, signal_handler);// 程序主循环while(1) {printf("程序运行中...\n");sleep(1);}return 0;}
使用sigaction()函数(推荐)
sigaction()比signal()更强大,提供了更多控制选项:
#include <signal.h>void signal_handler(int signum) {printf("捕获到信号 %d\n", signum);}int main() {struct sigaction sa;sa.sa_handler = signal_handler;sigemptyset(&sa.sa_mask); // 清空信号集sa.sa_flags = 0;// 注册SIGINT信号的处理函数sigaction(SIGINT, &sa, NULL);while(1) {printf("程序运行中...\n");sleep(1);}return 0;}
发送信号
进程可以使用kill()函数向其他进程发送信号:
#include <signal.h>#include <sys/types.h>int main() {pid_t pid = 1234; // 目标进程ID// 向进程发送SIGTERM信号kill(pid, SIGTERM);return 0;}
信号传递流程图:
信号集操作
信号集是一组信号的集合,可以用来表示要阻塞的信号。Linux提供了一系列函数来操作信号集:
#include <signal.h>int main() {sigset_t set;// 初始化信号集sigemptyset(&set); // 清空信号集// 添加信号到集合sigaddset(&set, SIGINT);sigaddset(&set, SIGTERM);// 阻塞这些信号sigprocmask(SIG_BLOCK, &set, NULL);// ... 执行不想被这些信号打断的代码 ...// 解除阻塞sigprocmask(SIG_UNBLOCK, &set, NULL);return 0;}
实际应用场景
1. 优雅地退出程序
当用户按下Ctrl+C时,我们可能需要先清理资源再退出:
#include <signal.h>#include <stdio.h>#include <stdlib.h>#include <unistd.h>volatile sig_atomic_t keep_running = 1;void cleanup_and_exit() {printf("清理资源...\n");// 关闭文件、释放内存等清理操作printf("清理完成,退出程序\n");}void handle_sigint(int sig) {printf("\n捕获到SIGINT信号\n");keep_running = 0;}int main() {struct sigaction sa;sa.sa_handler = handle_sigint;sigemptyset(&sa.sa_mask);sa.sa_flags = 0;sigaction(SIGINT, &sa, NULL);printf("程序开始运行,按Ctrl+C退出\n");while (keep_running) {printf("工作中...\n");sleep(1);}cleanup_and_exit();return 0;}
2. 父进程监控子进程
父进程可以通过SIGCHLD信号来监控子进程的状态变化:
#include <signal.h>#include <stdio.h>#include <stdlib.h>#include <sys/types.h>#include <sys/wait.h>#include <unistd.h>void handle_sigchld(int sig) {int status;pid_t pid;// 非阻塞方式等待任何子进程while ((pid = waitpid(-1, &status, WNOHANG)) > 0) {if (WIFEXITED(status)) {printf("子进程 %d 正常退出,退出码: %d\n", pid, WEXITSTATUS(status));} else if (WIFSIGNALED(status)) {printf("子进程 %d 被信号 %d 终止\n", pid, WTERMSIG(status));}}}int main() {struct sigaction sa;sa.sa_handler = handle_sigchld;sigemptyset(&sa.sa_mask);sa.sa_flags = SA_RESTART;sigaction(SIGCHLD, &sa, NULL);// 创建子进程pid_t pid = fork();if (pid < 0) {perror("fork");exit(1);} else if (pid == 0) {// 子进程printf("子进程 %d 开始运行\n", getpid());sleep(2);printf("子进程 %d 结束运行\n", getpid());exit(42);} else {// 父进程printf("父进程 %d 创建了子进程 %d\n", getpid(), pid);// 父进程继续执行其他工作for (int i = 0; i < 5; i++) {printf("父进程工作中...\n");sleep(1);}}return 0;}
3. 使用定时器
通过SIGALRM信号实现定时功能:
#include <signal.h>#include <stdio.h>#include <unistd.h>void handle_alarm(int sig) {printf("时间到!\n");}int main() {struct sigaction sa;sa.sa_handler = handle_alarm;sigemptyset(&sa.sa_mask);sa.sa_flags = 0;sigaction(SIGALRM, &sa, NULL);printf("设置3秒定时器...\n");alarm(3);printf("等待定时器...\n");pause(); // 暂停直到收到信号printf("继续执行\n");return 0;}
信号处理的注意事项
- 信号处理函数应该尽量简单:因为信号处理函数可能在任何时候被调用,所以应该避免复杂操作。
- 不可重入函数:在信号处理函数中应避免调用不可重入函数(如malloc、printf等),可能导致不可预测的行为。
- 全局变量访问:如果在信号处理函数和主程序之间共享变量,应声明为volatile sig_atomic_t类型,确保原子访问。
- SIGKILL和SIGSTOP:这两个信号不能被捕获、阻塞或忽略,始终执行默认动作。
- 信号丢失:如果同一信号多次发送,而进程还没来得及处理,通常只会记录一次,可能导致信号丢失。
信号与多线程
在多线程程序中,信号处理变得更加复杂:
- 信号会被发送到进程中的任一线程,由系统选择
- 可以使用pthread_sigmask()函数来设置线程的信号掩码
- 可以使用sigwait()函数来专门处理信号的线程
#include <signal.h>#include <pthread.h>#include <stdio.h>#include <unistd.h>void* signal_thread(void* arg) {sigset_t* set = (sigset_t*)arg;int sig;while (1) {// 等待信号sigwait(set, &sig);printf("收到信号 %d\n", sig);if (sig == SIGINT) {printf("处理SIGINT信号\n");} else if (sig == SIGTERM) {printf("处理SIGTERM信号,准备退出\n");break;}}return NULL;}int main() {sigset_t set;pthread_t thread;// 初始化信号集sigemptyset(&set);sigaddset(&set, SIGINT);sigaddset(&set, SIGTERM);// 在主线程中阻塞这些信号pthread_sigmask(SIG_BLOCK, &set, NULL);// 创建专门处理信号的线程pthread_create(&thread, NULL, signal_thread, &set);printf("主线程运行中,按Ctrl+C发送SIGINT,kill -15 %d发送SIGTERM\n", getpid());// 主线程继续工作while (1) {printf("主线程工作中...\n");sleep(1);}pthread_join(thread, NULL);return 0;}
小结
信号是Linux系统中一种重要的进程间通信机制,虽然功能相对简单(只能传递信号类型,不能传递额外数据),但在系统编程中有着广泛的应用。掌握信号处理,对于编写健壮的Linux程序至关重要。
信号机制看似简单,实则暗藏玄机,特别是在多线程环境下。作为一名C++开发工程师,我建议大家在实际项目中谨慎使用信号,遵循最佳实践,避免常见陷阱。
希望这篇文章能帮助你理解Linux信号机制!如果有问题,欢迎在评论区留言交流~
相关文章:
Linux信号机制:从入门到精通
嘿,小伙伴们!今天我要和大家聊一个Linux系统中非常有趣又重要的话题——信号机制。别担心,虽然信号听起来有点高深,但我会用最通俗易懂的语言,配合清晰的图表,带你彻底搞懂这个概念! 什么是信号…...
EXCEL数据报表
客单价成交金额*成交客户数 —— 提取年份 YEAR() 视图-窗口-新建窗口,就能将excel的一个子表格单拎出来成为独立窗口,方便对比查看 数据报表的单元格尽量都用公式来填补,链接到源表上去。这样当源表有新数据更新进来后,报表也…...
openGL学习(VAO和VBO)
理论 VBO void prepare() {//创建一个VBO,但是还没有分配显存GLuint vbo 0;GL_CALL( glGenBuffers(1, &vbo));cout << "vbo " << vbo << endl;//销毁一个VBOGL_CALL(glDeleteBuffers(1, &vbo));cout << "delete vbo "…...
【请关注】制造企业机械加工数据脱敏解决方案
制造企业机械加工数据脱敏解决方案 一、方案概述 在制造企业尤其是机械加工领域,数字化转型带来了生产效率的大幅提升,大量生产数据、设备运行数据、供应链数据以及客户订单数据等成为企业发展的关键驱动力。然而,这些数据中包含众多敏感信息,如客户定制产品的设计图纸(…...
2025.6.27总结
最近工作又开始内耗了,一位同事的转岗直接让我破防了,明明他工作干得很不错,会得又多,性格又好,我还经常请教他业务上的问题。我和他的关系并不算太好,但他加入其他部门,竟然让我有些不舍&#…...
Python打卡:Day38
知识点回顾: Dataset类的__getitem__和__len__方法(本质是python的特殊方法)Dataloader类minist手写数据集的了解 浙大疏锦行...
Ubuntu18.04/Mysql 5.7 建立主备模式Mysql集群
一、数据库的安装 详见https://www.jianshu.com/p/5073177eedf2 本文实验环境为阿里云的两台ubuntu18.04服务器: master ip: 172.26.138.7 slave ip: 172.26.0.209 二、修改Master的配置(# 的行是我后增加的部分): 编辑 /etc/mysql/mysql.conf.d/mysqld.…...
Linux journal 日志大小限制与管理详解
文章目录 Linux journal 日志大小限制与管理详解journal 日志的默认存储位置journal 日志大小限制配置查看当前日志占用情况手动清理日志文件按大小清理日志按时间清理日志按文件数清理日志 journald 日志机制原理简析(适当加点原理)日志筛选与导出技巧&…...
Linux基本指令篇 —— tac指令
tac 是 Linux 系统中一个非常实用的文本处理命令,它是 cat 命令的反向操作(名称也是 "cat" 的反写)。tac 是一个简单但功能强大的工具,特别适合需要反向处理文本数据的场景: 目录 一、基本功能 二、基本语法…...
【Yonghong 企业日常问题08 】永洪BI的Apache Tomcat版本升级指南
文章目录 前言操作步骤登录验证 前言 某公司业务永洪BI系统使用tomcat 9.0.97版本,接到总公司漏洞扫描整改要求需要将tomcat版本升级到9.0.97以上。 目标:tomcat 9.0.97》 9.0.98 1、下载tomcat所需要的版本 地址:https://tomcat.apache.org/download-…...
动手学Python:从零开始构建一个“文字冒险游戏”
动手学Python:从零开始构建一个“文字冒险游戏” 大家好,我是你的技术向导。今天,我们不聊高深的框架,也不谈复杂的算法,我们来做一点“复古”又极具趣味性的事情——用Python亲手打造一个属于自己的文字冒险游戏&…...
【C/C++】C++26新特性前瞻:全面解析未来编程
展望未来:C26 新特性全面解析 随着 C 标准每三年一次的迭代节奏,C26(预计于 2026 年底正式发布)正在逐步成型。相比 C20 的革命性更新和 C23 的“修补增强”,C26 继续推进现代 C 的理念——更安全、更高效、更模块化&…...
Linux系统日志与守护进程开发实战指南
Linux系统日志与守护进程开发实战指南 系统日志与守护进程 ├── 系统日志syslog │ ├── 日志路径: /var/log/syslog │ └── 核心API │ ├── openlog │ ├── syslog │ └── closelog └── 守护进程daemon└── 创建步骤├── um…...
兰洋科技上合组织论坛发表专题分享,全球液冷布局引领绿色算力未来
2025年6月17-19日,中国—上海合作组织数字技术合作发展论坛在新疆克拉玛依市举办。作为第四次上海合作组织成员国信息通信技术发展部门负责人会议的配套会议,论坛以“数字化转型助力可持续发展,数字包容促进上合共同繁荣”为主题,…...
桌面小屏幕实战课程:DesktopScreen 11 SPI 水墨屏
飞书文档https://x509p6c8to.feishu.cn/docx/doxcnlzpIgj3gosCZufBTCZxlMb SPI说明 SPI是串行外设接口(Serial Peripheral Interface)的缩写,是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上占用…...
小知识点五、无刷电机闭环控制(电流)
0 前言 该部分只用于自学使用,作为笔记方便后续自查。 资料参考:http://dengfoc.com 硬件:2208云台电机MT6701磁编码器 1 电流控制理论 1.1 待解决的问题 简单回顾一下在之前的学习中,我们通过 U q U_q Uq和电角度 θ \the…...
Java 编程之备忘录模式
前言 有时候,我们真希望人生能有“CtrlZ”。在日常生活中,我们经常使用“撤销”功能,例如在写 Word、画图、写代码时一不小心操作失误,就希望能回到之前的状态。这种**“状态快照 恢复”**机制,在设计模式中就叫做&a…...
SQL SERVER存储过程
什么是存储过程 SQL 存储过程(Stored Procedure)是一个在数据库中预编译并存储的一组 SQL 语句。它们可以包含查询、插入、更新、删除等数据库操作,甚至包括控制流语句(如条件判断、循环等)。存储过程可以通过调用来执…...
Vue样式绑定与条件渲染详
一、Vue样式绑定 在Vue中,我们可以通过多种方式动态地绑定样式,让界面根据数据状态变化而自动更新样式。 1. class样式绑定 (1) 字符串写法 适用场景:样式的类名不确定,需要动态指定 <template><div><!-- 绑定…...
python基于协同过滤的动漫推荐系统
目录 技术栈介绍具体实现截图系统设计研究方法:设计步骤设计流程核心代码部分展示研究方法详细视频演示试验方案论文大纲源码获取/详细视频演示 技术栈介绍 Django-SpringBoot-php-Node.js-flask 本课题的研究方法和研究步骤基本合理,难度适中…...
光场操控新突破!3D 光学信息处理迎来通用 PSF 工程时代--《自然》子刊:无需复杂算法,这一技术让 3D 光学成像实现 “即拍即得”念日
导语 在光学成像领域,如何突破分辨率与成像速度的瓶颈,一直是科研人员探索的焦点。近日,加州大学洛杉矶分校(UCLA)的研究团队在《Light: Science & Applications》发表论文,提出了一种通用点扩散函数&a…...
ubuntu20.04如何给appImage创建快捷方式
ubuntu20.04如何给appImage创建快捷方式 1. 确保AppImage是可执行的 chmod x /path/to/your/appimage2. 创建.desktop文件 在~/.local/share/applications/目录下创建一个新的 .desktop 文件: vi ~/.local/share/applications/your-appname.desktop添加以下内容…...
网络安全之SQL RCE漏洞
引言 堡垒机(Bastion Host),也称为跳板机或运维安全审计系统,是一种用于管理和控制对内部网络资源访问的安全设备。它的主要作用是作为运维人员访问内部服务器和网络设备的唯一入口,通过集中化的身份认证、权限管理和…...
DeepSeek网页版随机点名器
用DeepSeek帮我们生成了一个基于html5的随机点名器,效果非常棒,如果需要加入名字,请在代码中按照对应的格式添加即可。 提示词prompt 帮我生成一个随机点名的HTML5页面 生成真实一点的名字数据 点击随机按钮开始随机选择 要有闪动的效果 &…...
Elasticsearch索引字段的类型
在 Elasticsearch 中,索引字段的类型(即 Mapping 中的字段类型)对搜索和存储性能影响很大。下面是各种常用数据类型的用途及推荐使用场景总结: 1. keyword 类型(精确匹配) 适合数据: 不需要分词…...
大模型在慢性病毒性肝炎预测及诊疗方案制定中的应用研究
目录 一、引言 1.1 研究背景与意义 1.2 研究目的与创新点 二、慢性病毒性肝炎概述 2.1 疾病定义与分类 2.2 发病机制与病理特征 2.3 流行病学现状 三、数据收集与预处理 3.1 数据来源 3.2 数据清洗 3.3 特征工程 四、大模型选择与构建 4.1 模型选择依据 4.2 模型…...
DAY 43 复习日
浙大疏锦行https://blog.csdn.net/weixin_45655710 第一步:寻找并准备图像数据集 在Kaggle等平台上,你可以找到大量用于图像分类任务的数据集,例如英特尔图像分类数据集 (Intel Image Classification) 或手写数字识别数据集 (Digit Recogni…...
SQL学习笔记3
SQL常用函数 1、字符串函数 函数调用的语法:select 函数(参数); 常用的字符串函数有: 拼接字符串,将几个字符串拼到一起:concat (s1,s2,……); select concat(你好,hello); update mytable set wherefo concat(中…...
JVM调优实战 Day 7:JVM线程分析与死锁排查
【JVM调优实战 Day 7】JVM线程分析与死锁排查 文章标签 jvm调优, 线程分析, 死锁排查, JVM监控, Java性能优化, JVM参数配置 文章简述 在Java应用的高并发场景中,线程管理与死锁问题往往是性能瓶颈的根源。本文作为“JVM调优实战”系列的第7天,深入解析…...
Android-Layout Inspector使用手册
Layout Inspector Android Layout Inspector 是 Android Studio 中用于调试应用布局的工具 启动方法: 通过下载Layout Inspector插件,在 “View - Tool Windows - Layout Inspector” 或 “Tools - Layout Inspector” 启动。 主要界面区域:…...
【51单片机5毫秒定时器】2022-6-1
缘由单片机的代码,求大家来帮帮我-编程语言-CSDN问答 #include "REG52.h" unsigned char code smgduan[]{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0,64}; //共阴0~F消隐减号 unsigned char Js0, miao0;//中断…...
Flutter 多平台项目开发指南
Flutter 多平台项目开发指南 本指南将帮助你从 0 到 1 创建并适配一个支持 Android / iOS / Web / Windows / macOS / Linux 的 Flutter 多平台项目。 ✅ 一、创建支持多平台的 Flutter 项目 flutter create my_multi_platform_app cd my_multi_platform_app默认会生成支持以…...
Mac电脑如何搭建基于java后端的开发的各种工具服务
1. 确认Mac的CPU架构 首先,确认您的Mac是使用Intel还是Apple Silicon(如M1芯片)架构: uname -m如果返回x86_64,表示是Intel架构。如果返回arm64,表示是Apple Silicon架构。 2.安装IDEA Download Intelli…...
深入解析前端 Meta 标签:HTML 的隐形守护者与功能大师
在构建现代网页时,我们常常关注炫目的视觉效果、复杂的交互逻辑或强大的框架,却容易忽略那些深藏于 <head> 之中、看似不起眼的 <meta> 标签。这些标签如同网页的隐形守护者,无声地承担着定义文档元数据、指导浏览器行为、优化搜…...
CRON表达式编辑器与定时任务实现技术文档
1. 前端CRON表达式编辑器组件 CronExpressionEditor.vue组件是系统中用于创建和编辑CRON表达式的核心UI组件,它提供了直观的界面来生成复杂的定时任务表达式。 1.1 组件结构与状态管理 // 核心状态变量 const second ref<string>(0); const minute ref&…...
45. 跳跃游戏 II
给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]。 每个元素 nums[i] 表示从索引 i 向后跳转的最大长度。换句话说,如果你在 nums[i] 处,你可以跳转到任意 nums[i j] 处: 0 < j < nums[i] i j < n 返回到达 nums[n - 1] 的最…...
《解锁AudioSet:开启音频分析的无限可能》
音频新时代的 “密钥”:AudioSet 登场 在科技飞速发展的今天,音频作为信息传播与交互的关键媒介,早已渗透到现代科技的各个角落。从智能手机中的语音助手,让我们通过简单的语音指令就能查询信息、发送消息,到智能家居系…...
环境太多?不好管理怎么办?TakMll 工具帮你快速切换和管理多语言、多版本情况下的版本切换。
本篇文章主要介绍一款环境管理工具,即TakMll,通过简单的入口命令 “tkm” 即可快速的管理多种语言下、多种版本的环境切换,诸如快速切换PHP、同时存在java、mave等不同版本。 作者:任聪聪 日期:2025年6月26日 TakMll 特…...
spring-ai 1.0.0 (1)模型调用能力
听说1.0是一个非常好用的版本,最后还是扛不住听说的压力,为了落实自己悬浮心理,自己还是着手实践一下了。 第一步pom集成: 参考spring-projects/spring-ai | DeepWiki维基以及官方文档入门 :: Spring AI …...
如何在 Manjaro Linux 上启用 AUR 仓库来安装软件包
Manjaro 是基于 Arch 的系统,是了解和学习 Arch Linux 命令的绝佳方式。它自带所有流行的桌面环境界面,无论是 XFCE 还是 Gnome 的爱好者,都可以在 Manjaro 中直接使用。 Manjaro 或 Arch Linux 的默认软件包管理器是 Pacman,我们…...
简单使用python
本文章没有深入探讨python,只说语法格式,合适于有其他编程语言的基础、并想快速使用python的人查看。 一、print() 用于打印信息,括号中可以是数学运算表达式或者字符串(或者说是文字)。 print(hello!) 1.1、转义字…...
2025服务端java搭建篇:蜻蜓I即时通讯系统私有化部署深度指南-优雅草卓伊凡|麻子|贝贝
2025服务端java搭建篇:蜻蜓I即时通讯系统私有化部署深度指南-优雅草卓伊凡|麻子|贝贝 前言 蜻蜓I即时通讯系统是一款不依赖第三方服务的私有化即时通讯解决方案,本指南将详细介绍如何使用宝塔面板在CentOS系统上完成系统的完整部署。私有化部署意味着您…...
用Streamlit开发第一个Python应用程序
用Streamlit开发第一个Python应用程序 Using Streamlit to Develop the First Application in Python By JacksonML 1.Streamlit简介 Streamlit是个新出世的、功能强大的Python第三方库,将为基于Web的Python应用程序大放异彩。 Streamlit官网主页面如下&#x…...
IDEA + Spring Boot + javadoc 实例应用
1、添加 javadoc 插件 依赖 pom.xml <build><plugins><!-- javadoc 插件 --><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-javadoc-plugin</artifactId><version>3.6.3</version><…...
【机器学习深度学习】交互式线性回归 demo
目录 一、环境准备 二、Demo 功能 三、完整交互 demo 代码 3.1 执行代码 3.2 示例交互演示 3.3 运行结果 3.4 运行线性图 使用 PyTorch 构建交互式线性回归模型:输入数据、拟合直线、图像可视化并实现实时预测,助你深入理解机器学习从数据到模型的…...
新手向:Anaconda3的安装与使用方法
我们在刚开始接触Python时使用的是Python的直接编译器,如果我们需要进行其他的项目编写往往需要使用另一个版本的Python ,这样反复的下载很是麻烦并且还会造成系统变量的紊乱.这次我们引入Anaconda3,可创建虚拟的Python环境,满足不同项目的需要,当不用的时候可以直接放心删除不…...
详解零拷贝
目录 一、用户态(User Mode)和内核态(Kernel Mode) 1.1 用户态 (User Mode): 1.2 内核态 (Kernel Mode): 1.3 关键交互:系统调用 (System Call) 二、为什么需要区分用户态和内核态&#x…...
微服务常用的基础知识
1.微服务介绍 1.1 产生背景 随着互联网的发展,网站应用的规模不断扩大,传统单体架构逐渐难以应对大型网站高并发、高扩展性等需求,于是分布式系统架构应运而生。Spring Cloud 就是在这种背景下诞生的,它利用 Spring Boot 的开发便…...
【开源工具】Windows一键配置防火墙阻止策略(禁止应用联网)| 附完整Python源码
🛡️【开源工具】Windows一键配置防火墙阻止策略(禁止应用联网)| 附完整源码 🌈 个人主页:创客白泽 - CSDN博客 🔥 系列专栏:🐍《Python开源项目实战》 💡 热爱不止于代码,热情源自每一个灵感闪现的夜晚。愿以开源之火,点亮前行之路。 🐋 希望大家多多支持,…...
6月份最新代发考试战报:思科华为HCIP HCSE 考试通过
6月份最新代发考试战报:思科华为HCIP HCSE 考试通过 H19-423 HCSA-Presales-IP Network 数通考试通过, H12-725 HCIP-Security安全 考试通过,H13-121 HCIP-Kunpeng Application Developer鲲鹏计算 考试通过,CCNP 350-401考试通过…...