Linux应用:Linux的信号
什么是信号
信号是一种软件中断,用于通知进程系统中发生了某种特定事件。它是操作系统与进程之间,以及进程与进程之间进行异步通信的一种方式。在 Linux 系统中,信号是一种比较简单的进程间通信机制。当一个信号产生时,内核会通过某种方式通知相应的进程,进程接收到信号后,会根据信号的类型以及自身对该信号的处理方式来做出响应。例如,用户按下 Ctrl + C 组合键,系统会向当前前台进程发送一个 SIGINT 信号,通常情况下,进程接收到这个信号后会终止运行。
常见的信号
SIGINT
SIGINT:中断信号,通常由用户按下 Ctrl + C 组合键产生。它用于通知进程需要立即停止当前操作并退出。许多交互式程序,如命令行工具,在接收到 SIGINT 信号时会停止运行,清理资源并退出。
SIGTERM:终止信号。这是一个通用的终止信号,系统或其他进程可以发送给目标进程,请求其正常终止。与 SIGKILL 不同,SIGTERM 允许进程有机会在终止前进行清理操作,例如关闭打开的文件、释放内存等。许多服务器程序在接收到 SIGTERM 信号时,会停止接受新的连接,并逐步关闭当前正在处理的连接,然后安全退出。
SIGKILL
SIGKILL:强制终止信号。一旦进程接收到 SIGKILL 信号,内核会立即终止该进程,进程没有机会进行任何清理操作。这个信号主要用于处理那些陷入死锁或无法响应其他正常终止信号的进程。但由于它不允许进程进行清理,可能会导致资源没有正确释放等问题,所以一般作为最后的手段使用。
SIGALRM
SIGALRM:闹钟信号。进程可以使用 alarm 函数设置一个定时器,当定时器超时后,内核会向该进程发送 SIGALRM 信号。常用于实现定时任务,比如在一个网络请求中设置超时时间,如果在规定时间内没有得到响应,进程接收到 SIGALRM 信号后可以进行相应的错误处理。
SIGCHLD
SIGCHLD:子进程状态改变信号。当一个进程的子进程终止、暂停或继续运行时,内核会向该父进程发送 SIGCHLD 信号。父进程可以通过处理这个信号来回收子进程的资源,避免产生僵尸进程。
进程怎么处理信号
默认处理
默认处理:每个信号都有系统默认的处理方式。例如,对于 SIGINT 信号,默认处理方式是终止进程;对于 SIGQUIT 信号,默认处理方式是终止进程并生成核心转储文件(如果允许的话)。进程在没有对某个信号进行自定义处理时,就会按照系统默认方式来响应信号。
忽略信号
忽略信号:进程可以选择忽略某些信号,即接收到信号后不进行任何操作。但并不是所有信号都可以被忽略,例如 SIGKILL 和 SIGSTOP 信号不能被忽略,这是为了保证系统能够在必要时强制终止或暂停进程。一般情况下,进程可以通过调用 signal 函数来设置对某个信号的处理方式为忽略,例如signal(SIGINT, SIG_IGN); 这行代码会使进程忽略 SIGINT 信号,当用户按下 Ctrl + C 时,进程不会终止。
捕获信号并自定义处理
捕获信号并自定义处理:进程可以定义一个信号处理函数,当接收到特定信号时,内核会调用该函数,进程在函数中可以执行自定义的操作。首先需要定义信号处理函数,
#include <stdio.h>
#include <signal.h>
#include <unistd.h>
#include <fcntl.h>
#include <stdlib.h>int fd;
int* ptr;void sigint_handler(int signum) {printf("Received SIGINT. Cleaning up...\n");if (fd != -1) {close(fd);printf("File test.txt closed.\n");}if (ptr != NULL) {free(ptr);printf("Memory freed.\n");}exit(0);
}int main() {signal(SIGINT, sigint_handler);fd = open("test.txt", O_RDONLY);ptr = (int*)malloc(sizeof(int));while(1) {printf("Main process is working...\n");sleep(1);}return 0;
}
stdio.h:提供标准输入输出库函数,如 printf 用于输出信息。
signal.h:用于信号处理相关的函数和宏定义,这里会用到 signal 函数来设置信号处理程序。
unistd.h:包含了许多 Unix 标准库函数,例如 close 用于关闭文件描述符,sleep 用于使程序暂停执行。
fcntl.h:提供文件控制操作的函数和宏定义,代码中使用 open 函数来打开文件。
stdlib.h:包含通用工具函数,例如 malloc 用于动态分配内存,free 用于释放动态分配的内存,exit 用于终止程序。
fd:用于存储文件描述符,后续会通过 open 函数打开文件并将返回的文件描述符赋值给它。
ptr:是一个指向 int 类型的指针,用于存储动态分配的内存地址。
sigint_handler:这是一个信号处理函数,当进程接收到 SIGINT 信号时会被调用。
signum:是传递给信号处理函数的信号编号,在这个函数中,signum 的值为 SIGINT。
函数内部操作:
打印一条消息,表示接收到了 SIGINT 信号,开始进行清理工作。
检查 fd 是否有效(不等于 -1),如果有效则关闭文件并打印关闭文件的信息。
检查 ptr 是否为空指针,如果不为空则释放动态分配的内存并打印释放内存的信息。
调用 exit(0) 终止程序,返回状态码 0 表示正常退出。
signal(SIGINT, sigint_handler):将 SIGINT 信号的处理函数设置为 sigint_handler,这样当进程接收到 SIGINT 信号(通常是用户按下 Ctrl+C)时,会调用 sigint_handler 函数进行处理。
fd = open(“test.txt”, O_RDONLY);:以只读模式打开 test.txt 文件,并将返回的文件描述符赋值给 fd。
ptr = (int*)malloc(sizeof(int));:动态分配一个 int 类型大小的内存空间,并将其地址赋值给 ptr。
while(1):创建一个无限循环,模拟主程序持续执行任务。
printf(“Main process is working…\n”);:每秒打印一条消息,表示主程序正在运行。
sleep(1);:使程序暂停执行 1 秒,避免消息打印过快。
代码通过设置信号处理函数,确保在程序运行过程中接收到 SIGINT 信号时,能够正确地关闭打开的文件并释放动态分配的内存,然后正常终止程序,避免资源泄漏。
sigaction
sigaction 结构体:
struct sigaction sa;:定义一个 sigaction 结构体变量 sa,用于存储信号处理的相关信息。
sigemptyset(&sa.sa_mask);:清空 sa.sa_mask,表示在信号处理函数执行期间不阻塞其他信号。
sa.sa_handler = sigint_handler;:将信号处理函数设置为 sigint_handler。
sa.sa_flags = 0;:不设置特殊标志。
sigaction 函数调用:
sigaction(SIGINT, &sa, NULL):使用 sigaction 函数将 SIGINT 信号的处理方式设置为 sa 结构体中指定的方式。如果调用失败,sigaction 函数返回 -1,并通过 perror 输出错误信息。
#include <stdio.h>
#include <signal.h>
#include <unistd.h>
#include <fcntl.h>
#include <stdlib.h>int fd;
int* ptr;void sigint_handler(int signum) {printf("Received SIGINT. Cleaning up...\n");if (fd != -1) {close(fd);printf("File test.txt closed.\n");}if (ptr != NULL) {free(ptr);printf("Memory freed.\n");}exit(0);
}int main() {struct sigaction sa;// 清空 sigaction 结构体sigemptyset(&sa.sa_mask);// 设置信号处理函数sa.sa_handler = sigint_handler;// 不设置特殊标志sa.sa_flags = 0;// 使用 sigaction 函数设置信号处理if (sigaction(SIGINT, &sa, NULL) == -1) {perror("sigaction");return 1;}fd = open("test.txt", O_RDONLY);if (fd == -1) {perror("open");return 1;}ptr = (int*)malloc(sizeof(int));if (ptr == NULL) {perror("malloc");return 1;}while (1) {printf("Main process is working...\n");sleep(1);}return 0;
}
alarm 和pause函数
alarm 函数:alarm 函数用于设置一个定时器,在指定的秒数后,内核会向调用该函数的进程发送 SIGALRM 信号。函数原型为unsigned int alarm(unsigned int seconds);,参数 seconds 表示定时器的超时时间,单位为秒。如果在调用 alarm 函数时,之前已经设置过定时器且尚未超时,那么之前设置的定时器将被新的定时器覆盖,并且返回值是之前定时器剩余的时间。如果 seconds 为 0,则取消之前设置的定时器,并且返回值为之前定时器剩余的时间(如果之前没有设置定时器,则返回 0)。
#include <stdio.h>
#include <unistd.h>
#include <signal.h>void sigalrm_handler(int signum) {printf("Time's up!\n");
}int main() {signal(SIGALRM, sigalrm_handler);alarm(5); // 设置5秒后发送SIGALRM信号while(1) {// 主程序执行其他任务sleep(1);printf("Working...\n");}return 0;
}
设置了一个 5 秒的定时器,5 秒后进程接收到 SIGALRM 信号,会调用 sigalrm_handler 函数输出 “Time’s up!”。
每一个进程只有一个闹钟!!!
pause 函数:pause 函数用于使调用它的进程暂停执行,直到该进程接收到一个信号。函数原型为int pause(void);。如果进程接收到的信号的处理方式是默认处理或忽略,那么 pause 函数返回后,进程会继续执行 pause 函数后面的代码;如果进程接收到的信号的处理方式是捕获信号并执行自定义处理函数,那么在自定义处理函数执行完毕后,pause 函数返回,进程继续执行 pause 函数后面的代码。pause 函数的返回值总是 - 1,并且会设置 errno 为 EINTR,表示被信号中断。
#include <stdio.h>
#include <unistd.h>int main() {printf("程序将暂停,等待信号...\n");pause();printf("接收到信号,程序继续执行。\n");return 0;
}
while(1)和pause 的区别
资源占用
while(1):由于 while(1) 会不断地执行循环体,CPU 会一直处于忙碌状态,不断地执行指令,这会导致 CPU 占用率很高。即使循环体为空,CPU 也会不断地检查循环条件,造成资源的浪费。
pause():pause() 会使进程进入睡眠状态,此时进程不占用 CPU 时间,CPU 可以去执行其他任务,因此资源占用非常低。
用途
while(1):常用于需要持续运行的程序,例如服务器程序,需要不断地监听客户端的连接请求;或者在某些需要不断检查某个条件是否满足的场景中使用。
pause():主要用于让进程等待信号的到来,常用于需要响应外部事件的程序,例如信号驱动的程序,当接收到特定信号时执行相应的操作。
响应性
while(1):在 while(1) 循环中,如果要响应外部事件,需要在循环体中添加相应的检查代码,例如检查某个标志位或者读取某个文件描述符。这会增加代码的复杂性,并且响应的及时性可能会受到循环体中其他操作的影响。
pause():pause() 可以直接等待信号的到来,当信号到达时,进程会立即被唤醒并处理信号,响应性较高。
pause和alarm 模拟实现sleep
#include <iostream>
#include <unistd.h>
#include <signal.h>// 信号处理函数
void sig_alrm(int signo) {// 空函数,只是为了让 pause 函数返回
}// 模拟实现 sleep 函数
unsigned int my_sleep(unsigned int seconds) {struct sigaction newact, oldact;sigset_t newmask, oldmask, suspmask;unsigned int unslept;// 设置信号处理函数newact.sa_handler = sig_alrm;sigemptyset(&newact.sa_mask);newact.sa_flags = 0;sigaction(SIGALRM, &newact, &oldact);// 阻塞 SIGALRM 信号sigemptyset(&newmask);sigaddset(&newmask, SIGALRM);sigprocmask(SIG_BLOCK, &newmask, &oldmask);// 设定闹钟alarm(seconds);// 构建 sigsuspend 函数使用的信号掩码suspmask = oldmask;sigdelset(&suspmask, SIGALRM);// 等待信号sigsuspend(&suspmask);// 取消闹钟unslept = alarm(0);// 恢复原来的信号处理函数sigaction(SIGALRM, &oldact, nullptr);// 恢复原来的信号掩码sigprocmask(SIG_SETMASK, &oldmask, nullptr);return unslept;
}int main() {std::cout << "Going to sleep for 5 seconds..." << std::endl;my_sleep(5);std::cout << "Woke up!" << std::endl;return 0;
}
信号处理函数 sig_alrm:当 SIGALRM 信号产生时,此函数会被调用。这里只是一个空函数,其作用是让 pause 函数返回。
my_sleep 函数:
利用 sigaction 函数把 sig_alrm 设为 SIGALRM 信号的处理函数。
运用 sigprocmask 函数来阻塞 SIGALRM 信号。
借助 alarm 函数设定一个在指定秒数后触发的闹钟。
采用 sigsuspend 函数暂停进程,直至收到 SIGALRM 信号。
再次使用 alarm 函数取消闹钟,并且获取剩余的未休眠时间。
最后恢复原来的信号处理函数和信号掩码。
main 函数:调用 my_sleep 函数让程序休眠 5 秒,之后输出唤醒信息。
相关文章:
Linux应用:Linux的信号
什么是信号 信号是一种软件中断,用于通知进程系统中发生了某种特定事件。它是操作系统与进程之间,以及进程与进程之间进行异步通信的一种方式。在 Linux 系统中,信号是一种比较简单的进程间通信机制。当一个信号产生时,内核会通过…...
C++特性——RAII、智能指针
RAII 就像new一个需要delete,fopen之后需要fclose,但这样会有隐形问题(忘记释放)。RAII即用对象把这个过程给包起来,对象构造的时候,new或者fopen,析构的时候delete. 为什么需要智能指针 对于…...
springboot项目,指定用alibaba连接池所需要的配置
1、依赖:引入相关的两个依赖 2、application.yml...
在本地跑通spark环境
官网下载spark 下载spark 解压就好 本地配置环境变量 配置环境变量(系统环境变量) 新增 SPARK_HOME 变量名:SPARK_HOME 变量值:F:\class\spark\Spark_env\spark-3.4.4-bin-hadoop3 配置 PATH,新增如下:…...
python-56-基于Vue和Flask进行前后端分离的项目开发示例实战
文章目录 1 创建Vue前端项目1.1 运行demo1.2 实现需求2 flask部署上述dist(前后端未分离)2.1 代码app.py2.2 运行访问3 nginx部署(前后端分离)3.1 nginx前端服务3.3.1 windows安装nginx3.3.2 修改nginx.conf配置文件3.3.3 启动nginx3.3.3 停止nginx3.2 启动后端服务3.2.1 app.p…...
云盘搭建笔记
报错问题: No input file specified. 伪静态 location / {if (!-e $request_filename) { rewrite ^(.*)$ /index.php/$1 last;break;} } location / { if (!-e $request_filename) { rewrite ^(.*)$ /index.php/$1 last; break; } } 设…...
学习C2CRS Ⅳ (Conversational Recommender Model)
C2CRS_Model C2CRS_Model 是一个用于对话推荐系统(Conversational Recommender System, C2CRS)的端到端模型。该模型结合了知识图谱(KG)、上下文信息、用户表示和对话生成等多个模块,以实现高效的推荐和对话功能。它通过以下模块实现: 用户表示模块(CoarseFineDRUserMo…...
【工具】huggingface 模型下载过程
前述 记录下自己下载模型的几种方式 方式 1、网页直接浏览器下载: 简单,但是随时可能断 2、git lfs # 拉代码 GIT_LFS_SKIP_SMUDGE1 git clone https://huggingface.co/stabilityai/stable-diffusion-xl-base-1.0 # 进入目录 cd stable-diffusion-…...
空调遥控器低功耗单片机方案
RAMSUN空调遥控器采用先进的32位低功耗单片机作为核心控制器,通过优化软件算法和硬件设计,实现了空调遥控器的低功耗运行。单片机集成了多种功能模块,包括红外发射、按键扫描、电源管理等,有效降低了整体功耗。同时,该…...
K8S学习之基础三十五:k8s之Prometheus部署模式
Prometheus 有多种部署模式,适用于不同的场景和需求。以下是几种常见的部署模式: 1. 单节点部署 这是最简单的部署模式,适用于小型环境或测试环境。 特点: 单个 Prometheus 实例负责所有的数据采集、存储和查询。配置简单&…...
Agent toolkits集成指南
文章目录 CSV Agent的集成Pandas Dataframe Agent的集成PowerBI Dataset Agent的集成Agent toolkits的集成旨在简化并增强LLM应用中的数据处理和分析功能。CSVAgent提供了一个专门的工具,允许开发者处理CSV数据。Pandas Agent则集成了Pandas框架,赋予了开发者在应用中进行高效…...
蓝桥杯关于字符串的算法题目(leetcode回文串的判断问题)
文章目录 1.题目概述2.思路分析3.代码解析 1.题目概述 这个题目主要是需要我们找到回文串,这个回文实际上就是文学里面的这个修辞手法,在这个编程的时候:大概说的就是这个字符串从左向右个从右向左都是一样的这个效果,我们把这样…...
数据结构-----队列
顺序队列(Queue) 一、队列核心概念 1. 基本特性 先进先出(FIFO):最早入队的元素最先出队操作限制: 队尾(Rear):唯一允许插入的位置队头(Front)&…...
GitHub Copilot 在 VS Code 上的终极中文指南:从安装到高阶玩法
GitHub Copilot 在 VS Code 上的终极中文指南:从安装到高阶玩法 前言 GitHub Copilot 作为 AI 编程助手,正在彻底改变开发者的编码体验。本文将针对中文开发者,深度解析如何在 VS Code 中高效使用 Copilot,涵盖基础设置、中文优化…...
深入理解 RLP 编码与 JSON:原理、应用与比较
在区块链和数据存储领域,RLP(Recursive Length Prefix)编码和**JSON(JavaScript Object Notation)**是两种重要的数据编码方式。它们分别适用于不同的应用场景,并具有不同的优缺点。本文将系统性地分析 RLP…...
AI大白话(三):深度学习——AI的‘大脑‘是如何构建的?
🌟引言: 专栏:《AI大白话》 AI大白话(一):5分钟了解AI到底是什么? AI大白话(二):机器学习——AI是怎么“学习“的? 大家好!继前两篇介绍AI基础和机器学习的文章后,今天我们来聊聊深度学习——这个让AI技术近年来突飞猛进的"神奇引擎"。别担心,我会用…...
初识R语言饼状图
目录 基础饼图 标签个性化 边界修改 密度条纹 边框颜色 基础饼图 rm(list ls())# Create Data Prop <- c(3,7,9,1,2) # Make the default Pie Plot P1 <- pie(Prop) dev.off() 标签个性化 P2 <-pie(Prop , labels c("Gr-A","Gr-B","…...
[DeepRetrieval] 用DeepSeek-R1-Zero的思路教会模型怎么用搜索引擎找文本
前段时间很火的 DeepSeek-R1-Zero,通过这种方式既然能增强模型的推理能力,那是否可以在RAG的方面上增强文本的召回呢? 今天带来一篇关于这个方面工作的技术报告来分享一下。 技术报告: https://arxiv.org/pdf/2503.00223 原文链接…...
⭐算法OJ⭐二叉树的后序遍历【树的遍历】(C++实现)Binary Tree Postorder Traversal
⭐算法OJ⭐二叉树的中序遍历【树的遍历】(C实现)Binary Tree Inorder Traversal ⭐算法OJ⭐二叉树的前序遍历【树的遍历】(C实现)Binary Tree Preorder Traversal Given the root of a binary tree, return the postorder traver…...
【LeetCode 热题100】 234. 回文链表的算法思路及python代码
234. 回文链表 给你一个单链表的头节点 head ,请你判断该链表是否为回文链表。如果是,返回 true;否则,返回 false 。 示例 1: 输入:head [1,2,2,1] 输出:true示例 2: 输入&…...
Grid布局示例代码
示例一 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Grid Layout Example</title><styl…...
【K8S】ImagePullBackOff状态问题排查。
ImagePullBackOff 是在使用 Kubernetes(K8s)时经常遇到的一种错误状态,下面为你详细介绍其含义、可能的原因及解决办法。 含义 当你在 K8s 集群中创建一个 Pod 时,Kubelet 会尝试从指定的镜像仓库拉取所需的容器镜像。如果拉取镜…...
在 Kubernetes(k8s)部署过程中常见的问题
在 Kubernetes(k8s)部署过程中,常见的问题主要包括以下几类,以下是具体示例及简要说明: 1. 资源配额不足(Resource Quota) 现象:Pod 处于 Pending 状态,事件日志显示 Insufficient CPU/Memory。 原因: 节点(Node)资源不足,无法满足 Pod 的 requests 或 limits。 命…...
微信小程序状态管理与计算属性同时使用:miniprogram-computed 和 mobx-miniprogram
两个框架扩展提供的 ComponentWithStore 与 ComponentWithComputed 方法无法结合使用。如果需要在一个组件中既想使用 mobx-miniprogram-bindings 又想使用 miniprogram-computed解决方案是: 使用旧版 API 自定义组件仍然使用 Component 方法构建组件,将…...
Redis设置开机自启报错start-limit-hit
Redis设置开机自启报错start-limit-hit 问题:在银河麒麟服务器上编译安装了redis后设置systemctl开机自启报错start-limit-hit 如何解决? 因为开机自启的需求是后面新增的,所以一开始使用的是命令启动,使用命令启动就会直接在前台…...
[数据结构]排序之 归并排序(有详细的递归图解)
一、非递归 基本思想: 归并排序( MERGE-SORT )是建立在归并操作上的一种有效的排序算法 , 该算法是采用分治法( Divide andConquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列&#x…...
pdf文件分页按需查看
pdf预览本来打算粗暴点,一次性查看全部,但是一个pdf四五百页导致手机端查看超出内存直接崩掉,崩掉会导致页面疯狂刷新,所以不得不进行优化 解决思路大致如下: canvas转为blob格式以图片的形式加载在页面(B…...
栈/堆/static/虚表
在 C 里,栈空间主要用来存放局部变量、函数调用信息等。下面为你介绍栈空间在 C 里的运用方式。 1. 局部变量的使用 在函数内部定义的变量会被存于栈空间,当函数执行结束,这些变量会自动被销毁。 #include <iostream>void exampleFu…...
计算机网络技术服务管理基于Spring Boot-SSM
目录 一、引言 二、用户需求分析 三、功能介绍 3.1.资源管理: 3.2.故障管理: 3.3.性能管理: 3.4.安全管理: 3.5.配置管理: 3.6.日志管理: 3.7.用户管理࿱…...
Redisson 分布式锁原理
加锁原理 # 如果锁不存在 if (redis.call(exists, KEYS[1]) 0) then# hash结构,锁名称为key,线程唯一标识为itemKey,itemValue为一个计数器。支持相同客户端线程可重入,每次加锁计数器1.redis.call(hincrby, KEYS[1], ARGV[2], 1);# 设置过期时间redis.call(pexpi…...
LLM(5):了解 GPT 架构
1.6 对 GPT 架构的更深入了解 GPT 最初由 OpenAI 的 Radford 等人在论文《通过生成式预训练提高语言理解能力》 中提出。GPT-3 是该模型的扩展版本,具有更多的参数,并且使用了更大的数据集进行训练。此外,ChatGPT 中提供的原始模型是通过在大…...
Android Zygote 启动流程梳理
和你一起终身学习,这里是程序员Android 本篇文章主要介绍 Android Zygote 启动分析 知识点,通过阅读本篇文章,您将收获以下内容: 一、Android 系统基本服务二、虚拟机创建和第一个Java 程序引导三、Dalvik 虚拟机基本配置四、Zygote 启动流程…...
华为OD机试-绘图机器-双指针(Java 2025 A卷 100分)
题目描述 绘图机器的绘图笔初始位置在原点 (0, 0)。机器启动后按照以下规则绘制直线: 尝试沿着横坐标正向绘制直线,直到给定的终点 E。期间可以通过指令在纵坐标轴方向进行偏移,offsetY 为正数表示正向偏移,为负数表示负向偏移。给定的横坐标终点值 E 以及若干条绘制指令,…...
ESP32(1)基于ESP32的lwIP了解
ESP32-S3 是一款集成了 Wi-Fi 和蓝牙功能的微控制器,而 lwIP(轻量级 IP)是一个为嵌入式系统设计的开源 TCP/IP 协议栈。通过使用 lwIP 库, ESP32-S3 可以实现与外部网络的通信,包括发送和接收数据包、处理网络连接等。…...
C语言预处理详解
目录 (一)预处理符号 (二)define定义常量和宏 (三)#符号和##符号 (四)undef符号的条件编译 (五)头文件的包括 (一)预处理符号 在…...
python实现接口自动化
代码实现自动化相关理论 代码编写脚本和工具实现脚本区别是啥? 代码: 优点:代码灵活方便缺点:学习成本高 工具: 优点:易上手缺点:灵活度低,有局限性。 总结: 功能脚本:工…...
当Anaconda的安装路径与我想创建的conda虚拟环境路径不一致时,应该怎么操作?
我的anaconda安装在该路径:D:\Program\anaconda3 , 如果我想在F盘创建一个虚拟环境 应该怎么做呢? 若你想在 F 盘创建 Anaconda 虚拟环境,可使用 conda create 命令,并通过 --prefix 参数指定环境路径。以下是详细步骤࿱…...
MongoDB慢日志查询及索引创建
MongoDB 的慢日志(Slow Query Log)对于运维和程序员来说都非常重要,因为它直接关系到数据库的性能和应用程序的稳定性。以下分享介绍下MongoDB慢日志查询及索引创建相关的一些笔记。 一,准备 1. 使用 db.currentOp() 实时监控 …...
C语言指针(详细总结)
目录 1.初始C指针 几个重要的概念: 指针的加减 &与* 二级指针 2.指针与数组 指针数组 数组指针变量 一维数组与二维数组传参的本质 编辑编辑 编辑 3.指针与函数 函数指针数组 4.指针与结构体 5.野指针以及常见的内存管理错误 常见的内存错…...
服务器部署Kong和Konga过程
前言 最近在想怎么将一个接口给外部提供服务,并且可以根据和对放的关系,设置不同的期限或者服务大小?并且有友好的可视化页面! 这让我了解到了 API 网关,所以我开始研究 Kong 和 Konga 的使用。 实际上我最开始研究的apisix,但是部署了好久因为etcd不支持 http 无法连接…...
stm32第五天按键的基础知识
一:按键连接示意图 按键控制LED灯 软件设计流程 初始化系统 o 初始化GPIO外设时钟 o 初始化按键和LED的引脚 • 检测按键输入电平来控制LED灯 o SW2控制灯开 。 SW3控制灯关 1:key.c工程 #include"key.h" #include"stm32f10x.h"v…...
高主频CPU+RTX4090:AI生图性能优化超150%
概述:消费级高主频CPU搭配 RTX 4090显卡可以显著提高AI生图的性能,相比于企业级CPU具有更大的吞吐量和更优的成本效益。 引言:在AI图像生成过程中,CPU与GPU的协同效应对系统的整体性能至关重要。测试表明,与RTX 4090显…...
自学Python创建强大AI:从入门到实现DeepSeek级别的AI
人工智能(AI)是当今科技领域最热门的方向之一,而Python是AI开发的首选语言。无论是机器学习、深度学习还是自然语言处理,Python都提供了丰富的库和工具。如果你梦想创建一个像DeepSeek这样强大的AI系统,本文将为你提供…...
主流区块链
文章目录 主流链1. Solana特点:适用场景:工具链: 2. Binance Smart Chain (BSC)特点:适用场景:工具链: 3. Avalanche特点:适用场景:工具链: 4. Polkadot特点:…...
DevEco Studio的使用
目录 1.创建ArkTS工程 2.ArkTS工程目录结构(Stage模型) 构建第一个页面 构建第二个页面 实现页面间的跳转 1.创建ArkTS工程 若首次打开DevEco Studio,请点击Create Project创建工程。如果已经打开了一个工程,请在菜单栏选择…...
Oracle 公布 Java 的五大新功能
Java 增强提案包括语言增强和性能优化,从 JDK 25 中的稳定值 API 开始。 随着JDK(Java 开发工具包)24刚刚全面上市,Oracle 提前透露了不久的将来即将推出的 Java 功能,包括增强原始装箱到空限制值类类型。 3 月 18 日…...
checkpoint机制
1、什么是checkpoint 将缓冲池中的脏页刷新到磁盘,并更新redo log的checkpoint位点,确保数据库在发生故障时可以快速恢复到一致的状态。 2、checkpoint执行过程 确保需要刷新的脏页:从缓冲池中选取一部分需要刷新的页数据页刷新࿱…...
MySQL函数大全(持续更新)
MySQL常用函数 一、字符串函数 函数功能 CONCAT(s1, s2, ...) 拼接字符串 CONCAT_WS(sep, s1, s2, ...) 指定分隔符拼接字符串 SUBSTRING(str, start, length) 截取字符串 LEFT(str, length) 从左边截取指定长度字符串 RIGHT(str, length) 从右边截取指定长度字符串 LENGTH(s…...
商业智能BI分析中,汽车4S销售行业的返厂频次有什么分析价值?
买过车的朋友会发现,同一款车不管在哪个4S店去买,基本上价格都相差不大。即使有些差别,也是带着附加条件的,比如要做些加装需要额外再付一下费用。为什么汽车4S销售行业需要商业智能BI?就是因为在汽车4S销售行业&#…...
51单片机程序变量作用域问题
问题: //为什么下面这个程序可以运行 #include <REGX52.H> #include "LCD1602.h" #include "Delay.h" unsigned int result 0; void main(){LCD_Init();while(1){LCD_ShowNum(1,1,result,3);Delay(200);result;}; } //但是这样会报错&a…...