Linux:进程控制2
一:进程程序替换
1. 一旦程序替换成功,就去执行新代码了,原始代码的后半部分已经不存在了
2. exec*系列的函数,没有成功返回值,只有失败返回值-1
在程序替换的过程中,并没有创建新的进程,只是把当前进程的代码和数据用新的程序的代码和数据覆盖式的进行替换
1-1 execl
在Linux系统里,execl的一个系统调用函数,其作用是进程的程序替换
函数原型
#include<unistd.h>
int execl(const char* path,const char* arg,...)
- path:此参数为一个字符串指针,指向要执行的程序(命令)的完整路径。例如usr/bin/ls就代表ls命令的可执行文件完整路径
- arg:这是传给新程序的第一个参数,一般是程序(命令)自身的名称
- ...:这是可变参数列表,用来传递参数给新程序。参数列表的最后必须以NULL结尾,从而表明参数传递结束。
#include<stdio.h>#include<unistd.h>int main(){printf("我的程序要运行了\n");execl("/usr/bin/ls","ls","-l","-a",NULL);printf("我的程序运行完毕了\n");return 0;}
如上面代码所示, execl函数尝试执行/usr/bin/ls程序,并且传递了三个参数ls(程序本身),-l(用于显示详细信息),-a(显示全部信息),参数列表以NULL为结尾。若execl调用成功,当前进程就会被ls -l -a命令替换,从而显示当前目录下所有文件的详细信息。execl("/usr/bin/ls","ls","-l","-a",NULL);这条命令相当于先找到ls命令的路径,然后我们在终端输入的ls -l -a命令以逗号传递给每一个参数。我们可以看到下图中执行完ls -l -a将所有文件的详细信息打印后,后面没有打印 “我的程序运行完毕了” 这条语句,这是因为程序一旦替换成功就不再执行后序代码了,所以就没有打印
如下面代码所示,当我们将ls命令的路径和参数都传错时,execl进程的程序替换就会失败,我们用变量n来接收返回值,然后打印n的值,如下图所示,n的值为-1
#include<stdio.h>#include<unistd.h>int main(){printf("我的程序要运行了\n");int n = execl("/usr/bn/ls","aa","-l","-a",NULL);printf("我的程序运行完毕了,%d\n",n);return 0;}
在上面我们讲到在程序替换过程中没有创建新进程,如何验证呢?如下面代码所示,在proc.c代码中,我们创建一个子进程并在其中打印子进程的进程ID并用execl将当前目录下的可执行文件other,传递other给新程序实现进程替换。而在other.cc代码中打印其进程ID
proc.c代码:
1 #include<stdio.h>2 #include<unistd.h>3 #include<sys/types.h>4 #include<sys/wait.h>5 #include<stdlib.h>6 7 int main()8 {9 printf("我的程序要运行了\n");10 if(fork() == 0)11 {12 printf("I am Child,My Pid Is:%d\n",getpid());13 sleep(1);14 //execl("/usr/bin/ls","ls","-l","-a",NULL);15 execl("./other","other",NULL);16 exit(1);17 }18 waitpid(-1,NULL,0);19 printf("我的程序运行完毕了\n");20 return 0;21 }
other.cc代码:
1 #include<iostream>2 #include<unistd.h>3 4 int main()5 {6 std::cout << "hello C++,My Pid Is:" << getpid() << std::endl;7 8 return 0;9 }
由下图可见,两个代码的PID一样说明execl实现进程替换过程中没有创建新程序
1-2 execlp
函数原型:
#include<unistd.h>
int execlp(const char* file,const char* arg,...);
execlp中的p相当于PATH,因此execlp会自动在环境变量PATH中查找指定的命令,这意味着我们在使用这个函数时不需要将程序的路径传递给函数,只需要写需要执行的文件名即可
1 #include<stdio.h>2 #include<unistd.h>3 #include<sys/types.h>4 #include<sys/wait.h>5 #include<stdlib.h>6 7 int main()8 {9 printf("我的程序要运行了\n");10 if(fork() == 0)11 {12 printf("I am Child,My Pid Is:%d\n",getpid());13 sleep(1);14 execlp("ls","ls","-l","-a",NULL);15 16 exit(1);17 }18 waitpid(-1,NULL,0);19 printf("我的程序运行完毕了\n");20 return 0;21 }
如上代码所示,在子进程中执行execlp函数,执行ls -l -a命令,第一个参数为ls,因此系统会在PATH环境变量中搜索ls命令,后面的ls -l -a代表将当前目录下的所有文件的详细信息打印打印出来
1-3 execv
函数原型:
#include<unistd.h>
int execv(const char* path,char* const argv[]);
execv中的v可以理解为vector,相当于一个数组,参数path代表要执行的程序(命令)的完整路径,argv即提供一个命令行参数表(指针数组)
1 #include<stdio.h>2 #include<unistd.h>3 #include<sys/types.h>4 #include<sys/wait.h>5 #include<stdlib.h>6 7 int main()8 {9 printf("我的程序要运行了\n");10 if(fork() == 0)11 {12 printf("I am Child,My Pid Is:%d\n",getpid());13 sleep(1);14 char* const argv[] = {15 (char* const)"ls",16 (char* const)"-l",17 (char* const)"-a",18 NULL,19 }; 20 21 execv("/usr/bin/ls",argv);22 23 }24 waitpid(-1,NULL,0);25 printf("我的程序运行完毕了\n");26 return 0;27 }
如上代码所示,在子进程中,我们定义了一个指向char*的常量数组,数组变量分别为ls -l -a和NULL(表明结束),然后调用execv函数,在/usr/bin/ls目录下查找ls命令并执行ls命令,将argv数组传递给该命令
1-4 execvp
函数原型:
#include<unistd.h>
int execvp(const char* file,char* const argv[]);
execvp中的v代表传递一个指针数组给程序而不用传递参数列表,p代表PATH,因此不用写完整的路径。参数file要执行的程序名,argv传递给程序的参数数组
1 #include<stdio.h>2 #include<unistd.h>3 #include<sys/types.h>4 #include<sys/wait.h>5 #include<stdlib.h>6 7 int main()8 {9 printf("我的程序要运行了\n");10 if(fork() == 0)11 {12 printf("I am Child,My Pid Is:%d\n",getpid());13 sleep(1);14 char* const argv[] = {15 (char* const)"ls",16 (char* const)"-l",17 (char* const)"-a",18 NULL,19 };20 execvp(argv[0],argv);21 22 }23 waitpid(-1,NULL,0);24 printf("我的程序运行完毕了\n");25 return 0;26 }
如上代码所示:在子进程中,定义了一个参数数组argv,包含命令名ls和选项-l、-a,以NULL结尾,execvp函数根据argv[0](即ls)在环境变量PATH中查找ls可执行文件并执行该文件,同时将argv作为参数传递给它
二:自定义XShell代码
1 #include<iostream>2 #include<cstdio>3 #include<cstring>4 #include<cstdlib>5 #include<unistd.h>6 #include<sys/types.h>7 #include<sys/wait.h>8 9 #define COMMAND_SIZE 102410 #define FORMAT "[%s@%s %s]# "11 #define MAXARGC 12812 13 char* g_argv[MAXARGC];14 int g_argc = 0;15 16 char cwd[1024];17 char cwdenv[1024];18 19 //最新退出码20 int lastcode = 0;21 22 const char* GetUserName()23 {24 const char* name = getenv("USER");25 return name == NULL ? "None" : name;26 }27 28 const char* GetHostName()29 {30 const char* hostname = getenv("HOSTNAME");31 return hostname == NULL ? "None" : hostname;32 }33 34 const char* GetPwd()35 {36 //const char* pwd = getenv("PWD");37 const char* pwd = getcwd(cwd,sizeof(cwd));38 if(pwd != NULL)39 {40 snprintf(cwdenv,sizeof(cwdenv),"PWD=%s",cwd);41 putenv(cwdenv);42 }43 return pwd == NULL ? "None" : pwd;44 }45 46 const char* GetHome()47 {48 const char* home = getenv("HOME");49 return home == NULL ? "" : home;50 }51 52 // / /a/b/c路径获取切分53 std::string DirName(const char* pwd)54 {55 #define SLASH "/"56 std::string dir = pwd;57 if(dir == SLASH)58 {59 return "/";60 }61 auto pos = dir.rfind(SLASH);62 if(pos == std::string::npos)63 return "BUG?";64 return dir.substr(pos + 1);65 }66 67 68 void MakeCommandline(char cmd_prompt[],int size)69 {70 71 //snprintf(cmd_prompt,size,FORMAT,GetUserName(),GetHostName(),GetPwd());72 snprintf(cmd_prompt,size,FORMAT,GetUserName(),GetHostName(),DirName(GetPwd()).c_str());73 }74 75 //1.输出命令行提示符76 void PrintCommandline()77 {78 char prompt[COMMAND_SIZE];79 MakeCommandline(prompt,sizeof(prompt));80 printf("%s",prompt);81 fflush(stdout);82 }83 84 //2、获取命令行85 bool GetCommandline(char* out,int size)86 {87 //ls -a -l => "ls -a -l"88 char* c = fgets(out,size,stdin);89 if(c == NULL)90 return false;91 out[strlen(out) - 1] = 0;//清楚\n92 if(strlen(out) == 0)93 return false;94 return true;95 }96 97 //3.命令行分析98 bool ParseCommandline(char* commandline)99 {
100 #define SEP " "
101 g_argc = 0;
102 g_argv[g_argc++] = strtok(commandline,SEP);
103 while((bool)(g_argv[g_argc++] = strtok(nullptr,SEP)));
104 g_argc--;
105 return g_argc > 0 ? true : false;
106 }
107
108 //4、检查并执行内建命令
109 bool CheckAndExecBuiltin()
110 {
111 std::string cmd = g_argv[0];
112 if(cmd == "cd")
113 {
114 //cd
115 if(g_argc == 1)
116 {
117 std::string home = GetHome();
118 if(home.empty())
119 {
120 return true;
121 }
122 chdir(home.c_str());
123 }
124 else
125 {
126 //cd ~
127 std::string where = g_argv[1];
128 if(where == "~")
129 {
130 std::string home = GetHome();
131 if(home.empty())
132 return true;
133 chdir(home.c_str());
134 }
135 else
136 {
137 //cd /home/
138 std::string where = g_argv[1];
139 chdir(where.c_str());
140 }
141 }
142 return true;
143 }
144 else if(cmd == "echo")
145 {
146 if(g_argc == 2)
147 {
148 //echo "hello world"
149 //echo $?
150 //echo $PATH
151 std::string opt = g_argv[1];
152 if(opt == "$?")
153 {
154 std::cout << lastcode << std::endl;
155 lastcode = 0;
156 return true;
157 }
158 }
159 }
160 return false;
161 }
162 //5、执行命令
163 int Execute()
164 {
165 pid_t id = fork();
166
167 if(id == 0)
168 {
169 //child
170 execvp(g_argv[0],g_argv);
171 exit(1);
172 }
173
174 //father
175 int status = 0;
176 pid_t rid = waitpid(id,&status,0);
177 if(rid > 0)
178 {
179 lastcode = WEXITSTATUS(status);
180 }
181 return 0;
182 }
183
184 void PrintArgv()
185 {
186 for(int i = 0;g_argv[i];i++)
187 {
188 printf("argv[%d]->%s\n",i,g_argv[i]);
189 }
190 printf("argc:%d\n",g_argc);
191 }
192
193 int main()
194 {
195 while(1)
196 {
197 //1.输出命令行提示符
198 PrintCommandline();
199 char commandline[COMMAND_SIZE];
200 //2.获取命令行
201 if(!GetCommandline(commandline,sizeof(commandline)))
202 continue;
203 //printf("echo %s\n",commandline);
204
205 //3.命令行分析 "ls -a l" => "ls" "-a" "-l"
206 if(!ParseCommandline(commandline))
207 continue;
208 //PrintArgv();
209
210 //4、检查并处理内建命令
211 if(CheckAndExecBuiltin())
212 continue;
213
214 //5、执行命令
215 Execute();
216 }
217 return 0;
218 }
相关文章:
Linux:进程控制2
一:进程程序替换 1. 一旦程序替换成功,就去执行新代码了,原始代码的后半部分已经不存在了 2. exec*系列的函数,没有成功返回值,只有失败返回值-1 在程序替换的过程中,并没有创建新的进程,只是…...
Java jar包程序 启动停止脚本 shell bash
启动 启动时 可指定前缀(名称) start.sh #!/bin/bash # 使用时直接运行# 寻找当前目录下后缀为 .jar 的文件 #options($(find . -maxdepth 1 -type f -name "*.jar")) # 寻找当前目录下后缀为 .jar 的文件,并按时间倒序排序 opt…...
【Linux】进程通信 管道
🌻个人主页:路飞雪吖~ 🌠专栏:Linux 目录 一、👑进程间通信分类 二、👑管道 🌟什么是管道? 🌟匿名管道 🎉原理: 🔥站在文件描述…...
基于智能家居项目 解析DHT11温湿度传感器
一、模块简介 DHT11 是一款数字式温湿度传感器,内部集成了温度传感元件、湿度传感元件以及一个 8 位单片机芯片,用于采集数据和通信。。 测量范围:湿度 20%~90% RH,温度 0~50℃ 精度:湿度 5% …...
3.1 泰勒公式出发点
第一步:引入背景与动机 首先,泰勒公式(Taylor Series)是数学分析中的一个重要工具,它允许我们将复杂的函数近似为多项式形式。这不仅简化了计算,还帮助我们更好地理解函数的行为。那么为什么我们需要这样一…...
裸机开发的核心技术:轮询、中断与DMA
一、裸机开发的核心技术:轮询、中断与DMA 1. 轮询(Polling) 定义:程序主动、周期性地检查硬件状态或数据。应用场景:适用于简单、实时性要求不高的任务。示例: C while (1) { if (GPIO_ReadPin(SENSOR_P…...
从零开始:使用 Vue-ECharts 实现数据可视化图表功能
目录 前言为什么选择 Vue-ECharts案例:Vue-Echart开发一个分组柱状图 安装依赖 引入 全局引入 按需引入编写组件总结 前言 你好,小二!很高兴你愿意分享关于 Vue-ECharts 的使用经验。 📊 Vue-ECharts:让你在 Vue 项…...
Antd中Form详解:
1.获取Form表单值的方式: ① 使用Form.useForm()钩子(推荐方式) const [form] Form.useForm();const getFormValues () > {const values form.getFieldsValue();};<Form form{form}>...<Form.Item label{null}><Button onClick{ge…...
(2)python开发经验
文章目录 1 pyside6加载ui文件2 使用pyinstaller打包 更多精彩内容👉内容导航 👈👉Qt开发 👈👉python开发 👈 1 pyside6加载ui文件 方法1: 直接加载ui文件 from PySide6.QtWidgets import QAp…...
Landsat 5介绍
USGS Landsat 5 Level 2, Collection 2, Tier 1 数据集可用性:1984-03-16T16:18:01Z–2012-05-05T17:54:06Z 数据集提供程序 USGS Earth Engine 代码段 ee.ImageCollection("LANDSAT/LT05/C02/T1_L2") open_in_new 重新访问间隔:16 天 说…...
PowerShell 实现 conda 懒加载
问题 执行命令conda init powershell会在 profile.ps1中添加conda初始化的命令。 即使用户不需要用到conda,也会初始化conda环境,拖慢PowerShell的启动速度。 解决方案 本文展示了如何实现conda的懒加载,默认不加载conda环境,只…...
解锁ozon运营新路径:自养号测评技术如何实现降本增效
OZON测评自养号技术在跨境电商运营中具有显著的技术优势,主要体现在环境安全、账号控制、成本效率及风险规避等方面。以下是具体分析: 一:安全可控的测评环境搭建通过模拟俄罗斯本地物理环境和家庭住宅IP,自养号测评可规避平台风…...
算法第十七天|654. 最大二叉树、617.合并二叉树、700.二叉搜索树中的搜索、98.验证二叉搜索树
654. 最大二叉树 题目 思路与解法 # Definition for a binary tree node. # class TreeNode: # def __init__(self, val0, leftNone, rightNone): # self.val val # self.left left # self.right right class Solution:def constructMaximumB…...
Spring Boot 的自动配置为 Spring MVC 做了哪些事情?
Spring Boot 的自动配置为 Spring MVC 做了大量的工作,极大的简化了我们开发时的配置负担,我们可以快速启动并运行一个基于 Spring MVC 的 Web 应用。以下是 Spring Boot 自动配置为 Spring MVC 所做的主要事情: DispatcherServlet 的自动注册…...
【python】—conda新建python3.11的环境报错
1.报错 conda create -n py3.11 python3.11 --channel https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/ Collecting package metadata: done Solving environment: failed PackagesNotFoundError: The following packages are not available from current channel…...
桑德拉精神与开源链动2+1模式AI智能名片S2B2C商城小程序的协同价值研究
摘要:本文深入剖析桑德拉无私奉献精神在商业领域的映射价值,结合开源链动21模式、AI智能名片及S2B2C商城小程序的技术特性,系统探讨其在用户赋能、资源协同与价值共创中的协同效应。研究表明,该技术组合通过去中心化激励、智能需求…...
JavaEE--初识网络
目录 一、IP地址 二、端口号 三、认识协议 四、五元组 五、协议分层 1. OSI七层模型 2. TCP/IP五层(或四层)模型 3. 网络设备所在分层 4. 封装和分用 一、IP地址 IP地址(Internet Protocol Address)是用于标识设备在网络…...
2.7/Q2,Charls最新文章解读
文章题目:Climate risks, multi-tier medical insurance systems, and health inequality: evidence from Chinas middle-aged and elderly populations DOI:10.1186/s12913-025-12648-2 中文标题:气候风险、多层次医疗保险制度和健康不平等—…...
Mac显卡的工作原理及特殊之处
目录 🧠 一、显卡的基本工作原理(适用于所有平台) 🍏 二、Mac 显卡的工作机制 1. Mac 使用的显卡类型 Intel 架构时代(Intel CPU Intel/AMD 显卡) Apple Silicon 时代(M1/M2/M3 芯片&…...
MUSE Pi Pro 编译kernel内核及创建自动化脚本进行环境配置
视频讲解: MUSE Pi Pro 编译kernel内核及创建自动化脚本进行环境配置 今天分享的主题为创建自动化脚本编译MUSE Pi Pro的kernel内核,脚本已经上传到中 GitHub - LitchiCheng/MUSE-Pi-Pro-Learning: MUSE-Pi-Pro-Learning ,有需要可以自行clon…...
flink的TaskManager 内存模型
Flink TaskManager 的内存模型是一个多层管理体系,从 JVM 进程到具体任务的内存分配均有明确的逻辑划分和配置策略。以下是其核心构成及运行机制: 一、内存模型总览 TaskManager 内存整体分为 JVM 特有内存 和 Flink 管理内存 两大层级&…...
【NLP 72、Prompt、Agent、MCP、function calling】
命运把我们带到哪里,就是哪里 —— 25.5.13 一、Prompt 1.User Prompt 用户提示词 当我们与大模型进行对话时,我们向大模型发送的消息,称作User Prompt,也就是用户提示词,一般就是我们提出的问题或者想说的话 但是我们…...
无人机俯视风光摄影Lr调色预设,手机滤镜PS+Lightroom预设下载!
调色详情 无人机俯视风光摄影 Lr 调色是利用 Adobe Lightroom 软件,对无人机从俯视角度拍摄的风光照片进行后期处理的调色方式。通过调整色彩、对比度、光影等多种参数,能够充分挖掘并强化画面独特视角下的壮美与细节之美,让原本平凡的航拍风…...
【HTML5】【AJAX的几种封装方法详解】
【HTML5】【AJAX的几种封装方法详解】 AJAX (Asynchronous JavaScript and XML) 封装是为了简化重复的异步请求代码,提高开发效率和代码复用性。下面我将介绍几种常见的 AJAX 封装方式。 方法1. 基于原生 XMLHttpRequest 的封装 XMLHttpRequest。其主要特点如下…...
STM32 __rt_entry
STM32中__rt_entry函数的深度解析 在STM32的启动流程中,__rt_entry是一个由ARM C库提供的核心函数,负责在__main完成基础初始化后,搭建完整的C语言运行环境。以下是其核心功能及工作机制的详细分析: 一、__rt_entry的核心作用 …...
YOLOv11融合[AAAI2025]的PConv模块
YOLOv11v10v8使用教程: YOLOv11入门到入土使用教程 YOLOv11改进汇总贴:YOLOv11及自研模型更新汇总 《Pinwheel-shaped Convolution and Scale-based Dynamic Loss for Infrared Small Target Detection》 一、 模块介绍 论文链接:https://…...
point3d 视野朝向设置
这里写自定义目录标题 point3d 视野朝向设置三维相机朝向的直观理解 point3d 视野朝向设置 open3d.visualization.Visualizer 中的 get_view_control() 方法返回一个 ViewControl 对象,用来控制 3D 可视化窗口中的相机视角。通过这个对象可以设置视角朝向ÿ…...
基于大模型的腰椎管狭窄术前、术中、术后全流程预测与治疗方案研究报告
目录 一、引言 1.1 研究背景与意义 1.2 研究目的与创新点 二、腰椎管狭窄概述 2.1 定义与分类 2.2 发病原因与机制 2.3 临床表现与诊断方法 三、大模型技术原理与应用现状 3.1 大模型的基本原理 3.2 在医疗领域的应用案例 3.3 选择大模型预测腰椎管狭窄的依据 四、…...
Matlab基于SSA-MVMD麻雀算法优化多元变分模态分解
Matlab基于SSA-MVMD麻雀算法优化多元变分模态分解 目录 Matlab基于SSA-MVMD麻雀算法优化多元变分模态分解效果一览基本介绍程序设计参考资料效果一览 基本介绍 Matlab基于SSA-MVMD麻雀算法优化多元变分模态分解 可直接运行 分解效果好 适合作为创新点(Matlab完整源码和数据),…...
工程师必读! 3 个最常被忽略的 TDR 测试关键细节与原理
TDR真的是一个用来看阻抗跟Delay的好工具,通过一个Port的测试就可以看到通道各个位置的阻抗变化。 可是使用上其实没这么单纯,有很多细节需要非常地小心,才可以真正地看到您想看的信息! 就让我们整理3个极为重要的TDR使用小细节&…...
Spring Boot 项目中什么时候会抛出 FeignException?
在 Spring Boot 项目中使用 Feign 时,FeignException 是 Feign 客户端在执行 HTTP 请求过程中可能抛出的基础异常。它有很多子类,分别对应不同类型的错误。以下是一些常见的会抛出 FeignException (或其子类) 的情况: 网络连接问题 (Network …...
Spring Boot Swagger 安全防护全解析:从旧版实践到官方规范
摘要 本文系统梳理 Swagger 安全防护的核心方案,涵盖旧版 Swagger(SpringFox)的swagger.basic配置实践、官方推荐的 Spring Security 方案,以及多环境管理、反向代理过滤等全链路技术。结合权威文档,明确不同方案的适…...
基于 PLC 的轮式服务机器人研究
标题:基于 PLC 的轮式服务机器人研究 内容:1.摘要 本文以轮式服务机器人为研究对象,探讨基于可编程逻辑控制器(PLC)的设计与实现。在智能化服务需求不断增长的背景下,旨在开发一种具备稳定运动控制和高效服务功能的轮式服务机器人…...
emed64_20.9.2.msi 安装步骤(超简单版)
找到安装包 首先,先下载安装包链接:https://pan.quark.cn/s/2efb908815a4(可能在下载文件夹或者别人发给你的位置),双击它就行。如果双击没反应,就右键点它,选“安装”。 弹出安装向导 这时候会…...
HTML、CSS 和 JavaScript 基础知识点
HTML、CSS 和 JavaScript 基础知识点 一、HTML 基础 1. HTML 文档结构 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.…...
直接在Excel中用Python Matplotlib/Seaborn/Plotly......
本次分享如何利用pyxll包,实现直接在Excel中使用Python Matplotlib/Seaborn/Plotly等强大可视化工具。 pyxll配置 pyxll安装 pip install pyxll pyxll install pyxll自定义方法 例如,自定义一个计算斐波那契数的方法fib,并使用pyxll装饰器…...
互联网大厂Java求职面试:优惠券服务架构设计与AI增强实践-5
互联网大厂Java求职面试:优惠券服务架构设计与AI增强实践-5 第一轮面试:业务场景切入 面试官(技术总监): 欢迎郑薪苦参与今天的面试。我们先从一个实际业务场景谈起——假设你正在设计一个电商平台的优惠券服务系统&…...
KV cache 缓存与量化:加速大型语言模型推理的关键技术
引言 在大型语言模型(LLM)的推理过程中,KV 缓存(Key-Value Cache) 是一项至关重要的优化技术。自回归生成(如逐 token 生成文本)的特性决定了模型需要反复利用历史token的注意力计算结果&#…...
[250512] Node.js 24 发布:ClangCL 构建,升级 V8 引擎、集成 npm 11
目录 Node.js 24 版本发布:Windows 平台构建工具链转向 ClangCL Node.js 24 版本发布:Windows 平台构建工具链转向 ClangCL 流行的开源跨平台 JavaScript 运行时环境 Node.js 近日发布了 24.0 版本。此版本带来了多项性能提升、安全增强和开发体验的改进…...
Linux常用命令39——free显示系统内存使用量情况
在使用Linux或macOS日常开发中,熟悉一些基本的命令有助于提高工作效率,free命令的功能是显示系统内存使用量情况,包含物理内存和交换内存的总量、使用量、空闲量情况。本篇学习记录free命令的基本使用。 首先查看帮助文档: 语法格…...
4. 文字效果/2D-3D转换 - 3D翻转卡片
4. 文字效果/2D-3D转换 - 3D翻转卡片 案例:3D产品展示卡片 <!DOCTYPE html> <html><head><meta charset"utf-8"><title></title></head><style type"text/css">.scene {width: 300px;height…...
游戏引擎学习第276天:调整身体动画
运行游戏,演示我们遇到的拉伸问题,看起来不太好,并考虑切换到更顶视角的视角 我们开始讨论游戏开发中的一些美学决策,特别是在处理动画方面。虽然我们是游戏程序员,通常不负责设计或艺术部分,但因为这是一…...
Java线程池性能优化全解析:从配置到实践
一、线程池配置原则 1.1 核心参数设定 线程池的性能优化始于合理配置,关键参数包括: 核心线程数(corePoolSize) CPU密集型任务:设为Runtime.getRuntime().availableProcessors()(通常为CPU核心数)IO密集型任务:设为CPU核心数 * 2(或更高,根据IO等待时间调整)最大线…...
【入门】歌德巴赫猜想
描述 任一个大于等于4的偶数都可以拆分为两个素数之和。 输入描述 一个整数n( 4 < n < 200 ) 输出描述 将小于等于n的偶数拆分为2个质数之和,列出所有方案! 用例输入 1 10 用例输出 1 422 633 835 1037 1055 #include<b…...
kafka----初步安装与配置
目录标题 ⭐kafka 与 zookeeper间的关系一.集群部署二.修改配置文件三.分发安装包四.启动与关闭 kafka 与 zookeeper 相同,是以集群的形式使用 ⭐kafka 与 zookeeper间的关系 kafka 的使用 要在 zookeeper 集群配置好的基础上 使用要想启动kafka 要先启动 zookeep…...
如何通过 Windows 图形界面找到 WSL 主目录
WSL(Windows Subsystem for Linux)是微软开发的一个软件层,用于在 Windows 11 或 10 上原生运行 Linux 二进制可执行文件。当你在 WSL 上安装一个 Linux 发行版时,它会在 Windows 内创建一个 Linux 环境,包括自己的文件系统和主目录。但是,如何通过 Windows 的图形文件资…...
Cursor 编辑器 的 高级使用技巧与创意玩法
以下是针对 Cursor 编辑器 的 高级使用技巧与创意玩法 深度解析,涵盖代码生成优化、工作流定制、隐藏功能等层面,助你将 AI 辅助编程效率提升至新高度: 一、代码生成进阶技巧 1. 精准控制生成粒度 行级控制: 在代码行内用 // > 指定生成方向(替代模糊注释)def merge_…...
element-ui 源码调用接口跨域问题
今天在看 upload 组件源码时,在组件源码当中调用的本地启动的 nodejs 服务写的上传接口,遇到跨域问题: 问题一、在 upload.md 中调用 nodejs 服务中的 上传接口,控制台报跨域报错。 解决方法1:在根目录增加 vue.conf…...
Docker与PostgreSQL
1. 背景介绍 Docker是一种开源的容器化技术,它通过使用容器来隔离应用程序及其运行环境,使得开发人员能够快速、可靠地构建、部署和运行应用程序。Docker容器是轻量级的虚拟化单元,能够在任何支持Docker的操作系统上运行,从而消除…...
iVX 研发基座:大型系统开发的协作与安全架构实践
通过图形化开发、组件化封装和多厂商协作机制,iVX 解决了传统开发模式在效率、安全和扩展性上的痛点。文章结合政务、教育、企业等行业案例,展示其在数据治理、权限控制和 DevOps 等方面的创新实践,为大型系统开发提供完整的技术参考。 一、…...