当前位置: 首页 > news >正文

shell的模拟实现 ─── linux第16课

在shell的命令行中输入命令,会有两种执行命令的途径

  1.         shell自己执行
  2.         shell创建子进程(fork ,exit ,waitpid,exec) ,子进程去执行

shell自己执行的命令是自建命令(bulit command)

子进程执行的是非自建命令

第一版只能维护命令行参数表+创建子进程, 执行非内建命令

        我们先创建了命令行提示符 ,获取了命令行的内容,维护了命令行参数表,创建了子进程进行命令的执行

​1 #include<iostream>2 #include<cstdio>3 #include<stdlib.h>4 #include<cstring>5 #include<string>6 #include<unistd.h>7 #include<sys/types.h>8 #include<sys/wait.h>9 10 using namespace std;11 const int charsize =1024;12 const int gargvnum =64;13 14 //全局的15 char* gargv[gargvnum];16 int gargc;17 18 19 int lastcode = 0;20 21 string GetUsrName()22 {23     string name =getenv("USER");24     return name.empty()?  "None" : name;25 }26 string GetHostName()27 {28     string name =getenv("HOSTNAME");29     return name.empty()?  "None" : name;30 }31 string GetPwd()32 {33     string name =getenv("PWD");34     return name.empty()?  "None" : name;35 }36 string MakeCommandLine()37 {  //[root@hcss-ecs-1f3a lesson17]#  38     char CommandLine[charsize];39     snprintf(CommandLine ,charsize,"[%s@%s %s]# ",\40         GetUsrName().c_str(),GetHostName().c_str(),GetPwd().c_str());41     return CommandLine;42 }43 void PrintCommandLine()//1.打印命令行提示符44 {45     printf("%s",MakeCommandLine().c_str());46     fflush(stdout);47 }48 49 50 bool GetCommand(char Command_buff[] ,int size)//2.获取命令51 {52     //将命令输出到字符数组中53     //ls -a -l -n54     char*result =fgets(Command_buff,size,stdin);55     if(!result)56     {57         return false;58     }59     Command_buff[strlen(Command_buff)-1]= 0;//fgets会将回车(\n)也输入60     if(strlen(Command_buff) == 0) return false;//strlen遇0(\0)会停下来61     return true;62 }63 64  void ParseCommand(char Command_buff[] ,int size)//3.分析命令65 {66     memset(gargv ,0,sizeof(gargv));67     gargc=0;68     const char* SEP =" ";69     gargv[gargc++] = strtok(Command_buff ,SEP);//strtok 会在字符串中查找分隔符,并将分隔符替换为 \0,从而将字符串分割成多个70     while((bool)(gargv[gargc++] = strtok(nullptr,SEP)));//strtok后续使用要用nullptr代替元字符串71     gargc--;72 }73 74 void debug()75 {76     printf("argc: %d\n", gargc);77     for(int i = 0; gargv[i]; i++)78     {79         printf("argv[%d]: %s\n", i, gargv[i]);80     }81 }85 bool ExecuteCommand()//4.执行命令86 {87     pid_t id =fork();88     if(id ==0)89     {//子进程90         int ret =execvp(gargv[0],gargv);91         if(ret ==-1) cout<<"子进程出错\n"<<endl;92         exit(1);93     }94     int status =0;95     pid_t rid =waitpid(id,&status ,0);96     if(rid >0)97     {98         if(WIFEXITED(status))99         {
100            lastcode=WEXITSTATUS(status);
101         }
102         else lastcode =100;
103         return true;
104     }
105     return false;
106 
107 }
108 
109 int main()
110 {
111     char Command_buff[charsize];
112     while(true)
113     {
114         PrintCommandLine();//1.打印命令行提示符
115 
116         if(!GetCommand(Command_buff,charsize))//2.获取命令
117         {
118             continue;
119         }
120         ParseCommand(Command_buff ,charsize);//3.分析命令
121         //debug();
122         ExecuteCommand();//4.执行命令
123     }
124     return 0;
125 }​

第一版的执行结果:

  • 第一版在执行cd ..时,是改变了子进程的cwd,子进程执行完又退了,无法影响下面的进程,cd.. 不能让子进程执行.
  • 所以cd .. 或cd / 是自建命令 ,需要shell自己执行,以便可以影响到下面的进程(例如在/ 目录下创建文件)

 第二版能维护命令行参数表+执行cd命令 ,判断了是否是自建命令(mysell自己执行自建命令,可以对环境变量发生改变),子进程执行其他命令.

在执行创建子进程前判断,命令是否是内建命令(是否是cd 命令),是否要创建子进程.

getpwd不再是从环境变量中拿,从pcb中拿(因为pcb中是实时的),拿完更新环境变量(命令行提示符每次运行都会刷新,借此来维护cd 后的环境变量).

    #include<iostream>2 #include<cstdio>3 #include<stdlib.h>4 #include<cstring>5 #include<string>6 #include<unistd.h>7 #include<sys/types.h>8 #include<sys/wait.h>9 10 using namespace std;11 const int charsize =1024;12 const int gargvnum =64;14 //全局的15 char* gargv[gargvnum];16 int gargc;17 19 20 21 //全局的当前shell的工作路径(定义到全局不会被销毁)22 char pwd[charsize];23 char pwdenv[charsize];24 25 int lastcode = 0;26 27 string GetUsrName()28 {29     string name =getenv("USER");30     return name.empty()?  "None" : name;31 }32 string GetHostName()33 {34     string name =getenv("HOSTNAME");35     return name.empty()?  "None" : name;36 }string GetPwd()38 {39     //string name =getenv("PWD");40     //return name.empty()?  "None" : name;41 42 43     //从pcb中直接拿pwd44     if(nullptr ==  getcwd(pwd,sizeof(pwd))) return "None";45     //拿到后还需要更新环境变量中的pwd46     snprintf(pwdenv,sizeof(pwdenv),"PWD=%s",pwd);47     putenv(pwdenv);48     return pwd;49 50 51 }52 string MakeCommandLine()53 {  //[root@hcss-ecs-1f3a lesson17]#  54     char CommandLine[charsize];55     snprintf(CommandLine ,charsize,"[%s@%s %s]# ",\56         GetUsrName().c_str(),GetHostName().c_str(),GetPwd().c_str());57     return CommandLine;58 }59 void PrintCommandLine()//1.打印命令行提示符60 {61     printf("%s",MakeCommandLine().c_str());62     fflush(stdout);63 }64 65 66 bool GetCommand(char Command_buff[] ,int size)//2.获取命令67 {68     //将命令输出到字符数组中69     //ls -a -l -n70     char*result =fgets(Command_buff,size,stdin);71     if(!result)72     {73         return false;74     }75     Command_buff[strlen(Command_buff)-1]= 0;//fgets会将回车(\n)也输入76     if(strlen(Command_buff) == 0) return false;//strlen遇0(\0)会停下来77     return true;78 }80  void ParseCommand(char Command_buff[] ,int size)//3.分析命令81 {82     memset(gargv ,0,sizeof(gargv));83     gargc=0;84     const char* SEP =" ";85     gargv[gargc++] = strtok(Command_buff ,SEP);//strtok 会在字符串中查找分隔符,并将分隔符替换为 \0,从而将字符串分割成多个86     while((bool)(gargv[gargc++] = strtok(nullptr,SEP)));//strtok后续使用要用nullptr代替元字符串87     gargc--;88 }89 90 void debug()91 {92     printf("argc: %d\n", gargc);93     for(int i = 0; gargv[i]; i++)94     {95         printf("argv[%d]: %s\n", i, gargv[i]);96     }97 }98 99 
100 
101 bool ExecuteCommand()//4.执行命令
102 {
103     pid_t id =fork();
104     if(id ==0)
105     {//子进程
106         int ret =execvp(gargv[0],gargv);
107         if(ret ==-1) cout<<"子进程出错\n"<<endl;
108         exit(1);
109     }
110     int status =0;
111     pid_t rid =waitpid(id,&status ,0);
112     if(rid >0)
113     {
114         if(WIFEXITED(status))
115         {
116            lastcode=WEXITSTATUS(status);
117         }
118         else lastcode =100;
119         return true;
120     }return false;
122 
123 }
124 
125 //内建命令的执行(调用函数,改变状态)
126 bool CheckandExecBuiltCommand()
127 {   //使用穷举法找内建命令
128     if(0 == strcmp(gargv[0],"cd"))
129     {
130         if(gargc == 2)
131         {
132             chdir(gargv[1]);
133         }
134         return true;
135     }
136     return false;
137 
138 }
139 
140 int main()
141 {
142     char Command_buff[charsize];
143     while(true)
144     {
145         PrintCommandLine();//1.打印命令行提示符
146 
147         if(!GetCommand(Command_buff,charsize))//2.获取命令
148         {
149             continue;
150         }
151         ParseCommand(Command_buff ,charsize);//3.分析命令
152         //debug();
153         //判断是否是内建命令,shell自己执行
154         if(CheckandExecBuiltCommand())//是内建命令并执行
155         {
156             continue;
157         }
158         //不是内建命令,创建子进程执行
159         ExecuteCommand();//4.执行命令
160     }
161     return 0;
162 }

第二版执行结果:

第三版 模拟真实shell从系统文件中获取环境变量,维护命令行参数表+维护环境变量表(execvpe)

  • myshell前面的两版都是从系统shell中获取的环境变量表
  • 实际上,系统shell开启时,是从系统文件中获取环境变量表,但是这个过程涉及shell脚本(比较难搞,意义不大),
  • 所以我们用将系统shell的环境变量表手动拷贝到myshell中的过程来模拟系统shell开启时,是从系统文件中获取环境变量表

  • 要让myshell执行的子进程的环境变量与myshell一致(不与系统shell一致)使用execvpe
  • 系统的shell维护了两张表(命令行参数表+环境变量表)

第三版拷贝了环境变量表,维护了环境变量表(exxcvpe),增加了内置命令

第三版运行结果:

相关文章:

shell的模拟实现 ─── linux第16课

在shell的命令行中输入命令,会有两种执行命令的途径 shell自己执行 shell创建子进程(fork ,exit ,waitpid,exec) ,子进程去执行 shell自己执行的命令是自建命令(bulit command) 子进程执行的是非自建命令 第一版只能维护命令行参数表创建子进程, 执行非内建命令 我们先创…...

Luna——为游戏添加音效

1、在GameManager中声明 public AudioSource audiosource; public AudioClip normalClip; public AudioClip battleClip; 2、在GameManager资产中挂载“Audio Source”组件&#xff0c;并将该组件挂载到资产脚本中的声明对象 这就可以根据不同场景的需要切换背景音乐了&#x…...

计算机视觉算法实战——老虎个体识别(主页有源码)

✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连✨ ​ ​​​ 1. 领域介绍 老虎个体识别是计算机视觉中的一个重要应用领域&#xff0c;旨在通过分析老虎的独特条纹图案&#xff0c;自动识别和区…...

技术速递|GitHub Copilot Agent 模式(预览版)介绍

作者&#xff1a;Isidor Nikolic 翻译&#xff1a;Alan Wang GitHub Copilot Agent 模式&#xff08;预览版&#xff09;是 AI 辅助编码的最新进化。它作为一个自主的编程助手&#xff0c;可以根据你的指令执行多步骤的编码任务——分析代码库、读取相关文件、提出文件编辑建议…...

《安富莱嵌入式周报》第351期:DIY半导体制造,工业设备抗干扰提升方法,NASA软件开发规范,小型LCD在线UI编辑器,开源USB PD电源,开源锂电池管理

周报汇总地址&#xff1a;嵌入式周报 - uCOS & uCGUI & emWin & embOS & TouchGFX & ThreadX - 硬汉嵌入式论坛 - Powered by Discuz! 视频版&#xff1a; https://www.bilibili.com/video/BV16C95YEEZs 《安富莱嵌入式周报》第351期&#xff1a;DIY半导体…...

CSS—补充:CSS计数器、单位、@media媒体查询

目录 1. CSS计数器 嵌套计数器&#xff1a; 对列表元素&#xff1a; 2.单位 绝对长度&#xff1a; 相对长度&#xff1a; 3.media媒体查询 1. CSS计数器 CSS 计数器就像“变量”。变量值可以通过 CSS 规则递增&#xff08;将跟踪它们的使用次数&#xff09;。 如需使用…...

Phi-4-multimodal:图、文、音频统一的多模态大模型架构、训练方法、数据细节

Phi-4-Multimodal 是一种参数高效的多模态模型&#xff0c;通过 LoRA 适配器和模式特定路由器实现文本、视觉和语音/音频的无缝集成。训练过程包括多阶段优化&#xff0c;确保在不同模式和任务上的性能&#xff0c;数据来源多样&#xff0c;覆盖高质量网络和合成数据。它的设计…...

Leetcode::将水果放入篮子II(c++)

3477. 将水果放入篮子 II 提示 给你两个长度为 n 的整数数组&#xff0c;fruits 和 baskets&#xff0c;其中 fruits[i] 表示第 i 种水果的 数量&#xff0c;baskets[j] 表示第 j 个篮子的 容量。 你需要对 fruits 数组从左到右按照以下规则放置水果&#xff1a; 每种水果必…...

【C语言系列】字符函数和字符串函数

字符函数和字符串函数 一、字符分类函数二、字符转换函数三、strlen的使用和模拟实现3.1strlen函数3.2strlen函数模拟实现 四、strcpy的使用和模拟实现4.1strcpy函数4.2strcpy函数的模拟实现 五、strcat的使用和模拟实现5.1strcat函数5.2strcat函数的模拟实现 六、strcmp的使用…...

【计算机网络】深入解析 HTTP 协议的概念、工作原理和通过 Fiddler 抓包查看 HTTP 请求/响应的协议格式

网络原理— HTTP 1. 什么是HTTP? HTTP(全称为"超文本传输协议")是一种应用非常广泛的应用层协议&#xff1a; HTTP 往往是基于传输层的 TCP 协议实现的 (HTTP1.0,HTTP1.1,HTTP2.0 均为TCP,HTTP3基于UDP实现) 我们平时打开一个网站&#xff0c;就是通过HTTP协议来…...

InDraw6.2.3 | 甾体、核苷、黄酮类化合物实现简称命名

导语 当化学家对着屏幕输入"2-amino-1,9-dihydro-6H-purin-6-one"时&#xff0c;隔壁生物学家可能正在搜索"鸟嘌呤"&#xff1b;这种命名差异如同"火星文"与"地球语"的碰撞。现在&#xff0c;鹰谷InDraw 6.2.3版带着53种多环化合物的…...

AI Copilot——维新派的贾维斯,守旧派的墓志铭(程序员视角)

6500万年前的那颗陨石好像要落下来了 这一段时间&#xff0c;伴随着claude sonnet 3.7的发布 以及cursor&#xff0c;windsurf 等一众AI智能编辑器的涌现&#xff0c;社区的programming自媒体坐不住了&#xff0c;有一个观点已经快要溢出屏幕&#xff1a;程序员这个岗位要黄&a…...

c++ 接口/多态

目录 接口的通用定义 特点&#xff1a; C 中的接口 接口的作用 接口与抽象类的区别 什么是多态&#xff1f; 多态的类型 1. 编译时多态 2. 运行时多态 多态的实现原理 注意事项 在编程中&#xff0c;接口&#xff08;Interface&#xff09; 是一个抽象概念&#xff…...

【大模型学习】第十二章 大模型获取智能机制

目录 引言 1. 模型架构 Transformer架构 层次结构和层数 2. 训练数据 3. 大规模训练 4. 迁移学习与微调 4.1 微调步骤 5. 机制实例 自注意力机制 多头注意力机制 总结 引言 随着深度学习的发展&#xff0c;特别是大型预训练模型&#xff08;大模型&#xff09;的出…...

神经网络|(十四)|霍普菲尔德神经网络-Hebbian训练

【1】引言 前序学习进程中&#xff0c;除了对基本的神经网络知识进行了学习&#xff0c;还掌握了SOM神经网络原理&#xff0c;文章链接包括且不限于&#xff1a; 神经网络|(十一)|神经元和神经网络-CSDN博客 神经网络|(十二)|常见激活函数-CSDN博客 神经网络|(十三)|SOM神经…...

华为鸿蒙系统全景解读:从内核设计到生态落地的技术革命

华为鸿蒙系统全景解读&#xff1a;从内核设计到生态落地的技术革命 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;可以分享一下给大家。点击跳转到网站。 https://www.captainbed.cn/ccc 文章目录 华为鸿蒙系统全景解读&#x…...

基于大数据的Steam游戏数据分析可视化推荐系统

【大数据】&#x1f3ae; 项目名&#xff1a;游戏分析神器&#xff0c;用代码探析游戏世界——《基于大数据的Steam游戏分析与智能推荐系统》&#xff08;完整系统源码开发笔记详细部署教程&#xff09;✅ 目录 一、项目简介二、项目界面展示三、项目视频展示 一、项目简介 &a…...

将长上下文大语言模型研究从输入转向输出

将长上下文大语言模型研究从输入转向输出 摘要: 近年来&#xff0c;长上下文大语言模型&#xff08;LLMs&#xff09;的研发主要集中在处理更长的输入文本上&#xff0c;这使得模型在理解长篇内容时取得了显著进步。然而&#xff0c;生成长篇输出的研究却相对被忽视&#xff…...

Dify 开源大语言模型应用开发平台使用(二)

文章目录 说明Dify 使用报告1. 应用创建——专业的锂电池相关知识解答1.1 平台简介1.2 创建应用2. 知识库、工作流、变量、节点与编排节点详解2.1 知识库管理2.2 工作流配置2.3 变量管理2.4 节点与编排节点3. 测试和调试3.1 单元测试3.2 日志与监控3.3 实时调试3.4 性能测试总结…...

CarPlanner:用于自动驾驶大规模强化学习的一致性自回归轨迹规划

25年2月来自浙大和菜鸟网络的论文“CarPlanner: Consistent Auto-regressive Trajectory Planning for Large-scale Reinforcement Learning in Autonomous Driving”。 轨迹规划对于自动驾驶至关重要&#xff0c;可确保在复杂环境中安全高效地导航。虽然最近基于学习的方法&a…...

K8s面试题总结(十一)

1.如何优化docker镜像的大小&#xff1f; 使用多阶段构建&#xff08;multi-stage build&#xff09;选择更小的基础镜像&#xff08;如alpine&#xff09;减少镜像层数&#xff0c;合并RUN命令 2.请解释Docker中的网络模式&#xff08;如bridge,host,none) Bridge&#xff…...

Android Telephony 四大服务和数据网络控制面数据面介绍

在移动通信和Android系统中,涉及的关键概念和服务以及场景案例说明如下: 一、概念 (一)Android Telephony 的四大服务 介绍Telephony Data 与 Android Data 的四大服务在Android系统中,与电话(Telephony)和移动数据(Data)相关的核心服务主要包括以下四类: 1. Tele…...

一文讲懂Go语言如何使用配置文件连接数据库

一文讲懂Go语言如何使用配置文件连接数据库 viper1. viper简介2. viper 读取.toml配置文件定义Go语言结构体编写与Go语言结构体对应的.toml配置文件定义初始化函数定义get函数 连接数据库1. 定义数据库对象2. 定义初始化函数3. 定义 get 函数4. 定义 main 函数, 连接数据库 配置…...

Jmeter使用介绍

文章目录 前言Jmeter简介安装与配置JDK安装与配置JMeter安装与配置 打开JMeter方式一方式二 设置Jmeter语言为中文方法一&#xff08;仅一次性&#xff09;方法二(永久设置成中文) Jmeter文件常用目录 元件与组件元件组件元件的作用域元件的执行顺序第一个案例添加线程组添加 H…...

MES机联网4:文档资料

目录信息 MES机联网1&#xff1a;技术方案MES机联网2&#xff1a;采集网关MES机联网3&#xff1a;管理后台MES机联网4&#xff1a;文档资料 MQ接入文档 1、建立连接 mqtt连接地址: 192.168.0.138 mqtt端口: 1883 mqtt用户名&#xff1a;admin mqtt密码&#xff1a;123456 …...

豆包大模型 MarsCode AI 刷题专栏 001

001.找单独的数 难度&#xff1a;易 问题描述 在一个班级中&#xff0c;每位同学都拿到了一张卡片&#xff0c;上面有一个整数。有趣的是&#xff0c;除了一个数字之外&#xff0c;所有的数字都恰好出现了两次。现在需要你帮助班长小C快速找到那个拿了独特数字卡片的同学手上…...

常用无功功率算法的C语言实现(二)

0 前言 尽管数字延迟法和积分移相法在不间断采样的无功功率计算中得到了广泛应用,但它们仍存在一些固有缺陷。 对于数字延迟法而言,其需要额外存储至少1/4周期的采样点,在高采样频率的场景下,这对存储资源的需求不可忽视。而积分移相法虽然避免了额外的存储开销,但为了抑制…...

23种设计模式简介

一、创建型&#xff08;5种&#xff09; 1.工厂方法 总店定义制作流程&#xff0c;分店各自实现特色披萨&#xff08;北京店-烤鸭披萨&#xff0c;上海店-蟹粉披萨&#xff09; 2.抽象工厂 套餐工厂&#xff08;家庭装含大披萨薯条&#xff0c;情侣装含双拼披萨红酒&#…...

开发vue小游戏:数字华龙道

一、游戏介绍 1、历史背景 数字华容道脱胎于传统华容道&#xff0c;后者源自三国时期“曹操败走华容道”的故事。传统玩法是通过移动不同形状的木块&#xff0c;帮助“曹操”从出口逃脱。而数字华容道将棋子替换为数字&#xff0c;目标是通过滑动方块&#xff0c;将乱…...

electron的通信方式(三种)

文章目录 一、渲染进程向主进程发送消息二、渲染进程向主进程发送消息并异步获取结果三、主进程向渲染进程发送消息 electron的主要是主线程和渲染线程之间的通信&#xff0c;简单记录一下三种通信方式 一、渲染进程向主进程发送消息 利用ipcRenderer.send()和ipcMain.on()方法…...

MapReduce技术概述**

** MapReduce是一种并行计算框架&#xff0c;最初由Google开发&#xff0c;后来被Apache开源。它是一种分布式计算模型&#xff0c;能够处理大规模数据集&#xff0c;解决复杂的计算问题。MapReduce技术在数据处理和分析领域广泛应用&#xff0c;尤其是在大数据处理中。 MapR…...

ubuntu挂载固态硬盘

Ubuntu 中挂载位于 /dev/sdc1 的固态硬盘&#xff0c;可以按照以下步骤操作&#xff1a; 步骤 1&#xff1a;确认分区信息 首先&#xff0c;确保设备 /dev/sdc1 存在且已正确分区&#xff1a; sudo fdisk -l /dev/sdc # 查看分区表 lsblk # 确认分区路…...

同为科技智能PDU在数据中心场景的应用与解决方案

数据中心当前处于一个快速发展和技术变革的特殊时期&#xff0c;全新的人工智能应用正在重塑整个世界&#xff0c;为社会带来便捷的同时&#xff0c;也为数据中心的发展带来了新的机遇和挑战。智能算例的爆发式增长&#xff0c;对数据中心提出了大算力、高性能的新需求&#xf…...

golang学习笔记——go语言安装及系统环境变量设置

文章目录 go语言安装go envgo getgoproxy测试安装 Go 插件安装 Go 插件依赖工具参考资料用户环境变量和系统环境变量用户环境变量系统环境变量示例设置环境变量的步骤设置用户环境变量设置系统环境变量 验证环境变量总结 2024年最火的5大Go框架1. Gin&#xff1a;高并发接口的“…...

云服务器Linux安装Docker

系统要求 Docker 官方建议将 Docker 运行在 Linux系统上&#xff0c;当然也可以在其他平台运行&#xff0c;本篇博客只介绍在 Linux 系统上的安装方法。 Docker 运行在 CentOS7.X 版本以上&#xff0c;本文使用阿里云 ECS 云服务器 CentOS 7.4 版本。 Docker 需要安装在 64 …...

2025DNS二级域名分发PHP网站源码

安装教程 1.程序必须使用PHP8.1 2.将扩展ixed.8.1.lin放入/www/server/php/81/lib/php/extensions/no-debug-non-zts-20210902 3.打开宝塔→软件商店→PHP8.1→配置文件 4.放入&#xff1a;extensionixed.8.1.lin 5.重启PHP8.1 6.新建站点&#xff08;mysql5.6-5.7andPHP8.1&a…...

审批流AntV框架蚂蚁数据可视化X6饼图(附注释)

大家好&#xff0c;这次使用的是AntV的蚂蚁数据可视化X6框架&#xff0c;类似于审批流的场景等&#xff0c;代码如下&#xff1a; X6框架参考网址&#xff1a;https://x6.antv.vision/zh/examples/showcase/practices#bpmn 可以进入该网址&#xff0c;直接复制下方代码进行调试…...

git 添加额外的远程仓库 URL

要使用 git branch -a 查看 net-next 远程仓库中的所有分支&#xff0c;请按照以下步骤操作&#xff1a; 步骤 1: 确保已添加 net-next 远程仓库 如果尚未添加 net-next 远程仓库&#xff0c;请运行以下命令&#xff1a; git remote add net-next git://git.kernel.org/pub/s…...

Qt中实现多个QMainWindow同时显示

在Qt中实现多个QMainWindow同时显示&#xff0c;可通过以下方法实现&#xff1a; 一、直接显示多个实例 必须使用new创建堆对象&#xff0c;避免栈对象因作用域结束被销毁‌。 int main(int argc, char *argv[]) {QApplication a(argc, argv);// 创建两个独立的主窗口QMainW…...

在ArcMap中通过Python编写自定义工具(Python Toolbox)实现点转线工具

文章目录 一、需求二、实现过程2.1、创建Python工具箱&#xff08;.pyt&#xff09;2.2、使用catalog测试代码2.3、在ArcMap中使用工具 三、测试 一、需求 通过插件的形式将点转线功能嵌入ArcMap界面&#xff0c;如何从零开始创建一个插件&#xff0c;包括按钮的添加、工具的实…...

关于AI数据分析可行性的初步评估

一、结论&#xff1a;可在部分环节嵌入&#xff0c;无法直接处理大量数据 1.非本地部署的AI应用处理非机密文件没问题&#xff0c;内部文件要注意数据安全风险。 2.AI&#xff08;指高规格大模型&#xff09;十分适合探索性研究分析&#xff0c;对复杂报告无法全流程执行&…...

cdn取消接口缓存

添加cdn后&#xff0c;使用cdn加速域名访问接口 是缓存&#xff0c;不是最新的数据&#xff0c;如果使用局域网则是最新的数据&#xff0c;如果修改配置&#xff0c;确保使用cdn域名请求的接口返回不是缓存 要确保通过CDN加速域名访问接口时返回的是最新的数据&#xff0c;而不…...

Android 屏幕适配 Tips

概念 屏幕尺寸&#xff1a;屏幕的对角线的长度屏幕分辨率&#xff1a;屏幕分辨率是指在横纵向上的像素点数&#xff0c;单位是px&#xff0c;1px1个像素点。一般以纵向像素x横向像素&#xff0c;如1960x1080屏幕像素密度&#xff1a;每英寸上的像素点数&#xff0c;单位是dpi …...

【Academy】HTTP Host 标头攻击 ------ HTTP Host header attacks

HTTP Host 标头攻击 ------ HTTP Host header attacks 1. 什么是 HTTP Host 标头&#xff1f;2. 什么是 HTTP Host 标头攻击&#xff1f;3. HTTP Host 标头漏洞是如何产生的&#xff1f;4. 如何测试 HTTP Host 标头漏洞4.1 提供任意 Host 标头4.2 检查有缺陷的验证4.3 发送不明…...

大模型架构记录2

一 应用场景 1.1 prompt 示例 1.2 自己搭建一个UI界面&#xff0c;调用接口 可以选用不同的模型&#xff0c;需要对应的API KEY 二 Agent 使用 2.1 构建GPT...

在Windows 11的WSL中安装Kali Linux

Kali Linux 是网络安全从业者和爱好者的首选工具集&#xff0c;但直接在物理机或虚拟机上运行可能占用较多资源。借助 Windows Subsystem for Linux (WSL)&#xff0c;我们可以在Windows 11中原生运行Kali Linux&#xff0c;轻量且高效。本教程将手把手教你如何在WSL2中安装并配…...

Qt调试功能使用方法

QT编程环境 QT在Windows操作系统下的三种编程环境搭建。 方案编程环境编译器调试器1Qt CreatorMinGW GCCGDB2Qt CreatorMicrosoft Visual C CompilerDebugging Tools for Widows3Microsoft Visual Studio VS自带VS自带 方案提及的QT安装程序及压缩包均能在官网Index of /off…...

一篇文章讲解清楚ARM9芯片启动流程

SAM9X60 ARM9 boot启动流程关键词介绍&#xff1a; 第一级bootloader - 也叫boot ROM&#xff0c;是集成在MPU内部的ROM里面 它的主要功能是执行对MPU的基本初始化和配置&#xff0c;查找并将第二级bootloader从外部NVM中读取出来并放到MPU内部的SRAM. 可以让MPU强制停留在第一…...

DeepSeek未来发展趋势:开创智能时代的新风口

DeepSeek未来发展趋势&#xff1a;开创智能时代的新风口 随着人工智能&#xff08;AI&#xff09;、深度学习&#xff08;DL&#xff09;和大数据的飞速发展&#xff0c;众多创新型技术已经逐渐走向成熟&#xff0c;而DeepSeek作为这一领域的新兴力量&#xff0c;正逐步吸引越…...

Spring Boot与Axon Framework整合教程

精心整理了最新的面试资料和简历模板&#xff0c;有需要的可以自行获取 点击前往百度网盘获取 点击前往夸克网盘获取 简介 Axon Framework是一个用于构建CQRS&#xff08;命令查询职责分离&#xff09;和事件溯源&#xff08;Event Sourcing&#xff09;应用的框架&#xff0…...