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

进程程序替换

fork() 之后,⽗⼦各⾃执⾏⽗进程代码的⼀部分如果⼦进程就想执⾏⼀个全新的程序呢?进程的程序

替换来完成这个功能!

程序替换是通过特定的接⼝,加载磁盘上的⼀个全新的程序(代码和数据),加载到调⽤进程的地址空间中!

 4.1 替换原理

fork创建⼦进程后执⾏的是和⽗进程相同的程序(但有可能执⾏不同的代码分⽀),⼦进程往往要调⽤⼀种exec函数以执⾏另⼀个程序。当进程调⽤⼀种exec函数时,该进程的⽤⼾空间代码和数据完全被新程序替换,从新程序的启动例程开始执⾏。调⽤exec并不创建新进程,所以调⽤exec前后该进程的id并未改变。

 

 4.2 替换函数

其实有六种以exec开头的函数,统称exec函数:
man exec
#include <unistd.h>int execl(const char *path, const char *arg, ...);
int execlp(const char *file, const char *arg, ...);
int execle(const char *path, const char *arg, ...,char *const envp[]);
int execv(const char *path, char *const argv[]);
int execvp(const char *file, char *const argv[]);
int execve(const char *path, char *const argv[], char *const envp[]);

4.2.1 函数解释

  • 这些函数如果调⽤成功则加载新的程序从启动代码开始执⾏,不再返回。
  • 如果调⽤出错则返回-1
  • 所以exec函数只有出错的返回值⽽没有成功的返回值

4.2.1 函数讲解

第一种:

int execl(const char *path, const char *arg, ...);

知识点:对于接下来讲的exec序列函数中的知识点是通用的

1.一旦exec函数替换,就去执行新代码了,原始后面的代码已经不存在了, 

2.不做返回值判断,只要返回就是失败了。

引出问题:除了替换指令可以替换自己写的程序吗

 先随意写一个语言的代码 c++为例

怎么证明当前你在进行替换的时候,并没有创建新的进程呢,是同一个pid吗?

 

原理:没有在原替换过程,创建新程序,只是把当前进程的代码和数据用新的程序的代码与数据覆盖式的替换,此时子进程与父进程再也没有关系了,他们分离了。

第二种

execlp("ls","ls","-ln","-a",NULL);

第三种

#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>int main()
{printf("我的程序要运行了!\n");if(fork() == 0){printf("I am Child, My Pid Is: %d\n", getpid());sleep(1);char *const argv[] = {  //命令行参数表(char*const)"ls",(char*const)"-l",(char*const)"-a",NULL};execv("/usr/bin/ls", argv);exit(1);}waitpid(-1, NULL, 0);printf("我的程序运行完毕了\n");//return 0;
}

 小知识:所有进程所需要的命令行参数都是通过父进程用exec 传的命令行参数

第四种带有环境变量

相关问题

1. 关于 execve 更新环境变量后以前环境变量消失

execve 函数执行成功后,会用新程序完全替换当前进程的执行映像,包括代码段、数据段等。新程序启动时,使用的是通过 envp 参数传入的环境变量数组。如果传入的 envp 中不包含之前进程的某些环境变量,那么在新程序中这些之前的环境变量就不存在了。

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>int main() {char *const argv[] = {"echo", "Hello"};char *const new_envp[] = {"MY_NEW_VAR=value",NULL};// 执行echo程序,传递新的环境变量数组,原进程环境变量未传入if (execve("/bin/echo", argv, new_envp) == -1) {perror("execve");exit(EXIT_FAILURE);}return 0;
}

在上述代码中,execve 执行 echo 程序时,只传入了自定义的环境变量数组 new_envp ,原进程的环境变量没有包含在内,所以 echo 程序运行时看不到原进程的环境变量,就好像之前的环境变量 “消失” 了。

2. 使用 putenv 更新环境变量示例

#include <stdio.h>
#include <stdlib.h>
#include <string.h>int main() {// 定义要设置的环境变量字符串char var_value[] = "MY_VAR=HelloWorld";// 使用putenv设置环境变量if (putenv(var_value) != 0) {perror("putenv");return EXIT_FAILURE;}// 获取并打印环境变量char *value = getenv("MY_VAR");if (value != NULL) {printf("MY_VAR value: %s\n", value);} else {printf("Failed to get MY_VAR\n");}return EXIT_SUCCESS;
}

在这个例子中,putenv 函数用于将 MY_VAR=HelloWorld 这个环境变量添加到当前进程的环境变量表中。putenv 函数接受一个形如 "变量名=变量值" 的字符串参数,如果设置成功,它不会返回错误值;若失败(比如内存分配问题等 ),则返回非零值。之后通过 getenv 函数获取并打印刚刚设置的环境变量的值。

3. 证明不更新环境变量子进程本身有

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>int main() {pid_t pid = fork();if (pid < 0) {perror("fork");return EXIT_FAILURE;} else if (pid == 0) {// 子进程char *value = getenv("PATH");if (value != NULL) {printf("子进程中PATH环境变量值: %s\n", value);} else {printf("子进程中获取PATH环境变量失败\n");}return EXIT_SUCCESS;} else {int status;pid_t wpid = waitpid(pid, &status, 0);if (wpid == -1) {perror("waitpid");return EXIT_FAILURE;}return EXIT_SUCCESS;}
}

在这段代码中,通过 fork 创建子进程。子进程中使用 getenv 函数获取 PATH 环境变量(没有对环境变量进行更新操作 )。由于子进程会继承父进程的环境变量,所以在子进程中可以获取到父进程传递下来的 PATH 环境变量的值,从而证明子进程本身在不更新环境变量的情况下,是有从父进程继承来的环境变量的。

 小知识:其实替换函数有七个 ,上面举例了六个,剩下的哪一个是系统调用的,也就是说,为什么那六个就算不写环境变量,也会本身自带,正是因为那六个是语言封装的,自动会调用系统自带的。

相关文章:

进程程序替换

fork() 之后,⽗⼦各⾃执⾏⽗进程代码的⼀部分如果⼦进程就想执⾏⼀个全新的程序呢&#xff1f;进程的程序 替换来完成这个功能&#xff01; 程序替换是通过特定的接⼝&#xff0c;加载磁盘上的⼀个全新的程序(代码和数据)&#xff0c;加载到调⽤进程的地址空间中&#xff01…...

6.7 ChatGPT自动生成定时任务脚本:Python与Cron双方案实战指南

ChatGPT自动生成定时任务脚本:Python与Cron双方案实战指南 关键词:定时任务调度, ChatGPT 代码生成, Cron 脚本开发, Python 调度器, 自动化更新系统 6.3 使用 ChatGPT 生成 Cron 调度脚本 在 GitHub Sentinel 的定期更新功能中,定时任务调度是核心模块。本节演示如何通过…...

废物九重境弱者学JS第十四天--构造函数以及常用的方法

目录 JavaScript 进阶 - 第2天 深入对象 构造函数 实例成员 静态成员 内置构造函数 Object Array 包装类型 String Number 案例 JavaScript 进阶 - 第2天 了解面向对象编程的基础概念及构造函数的作用&#xff0c;体会 JavaScript 一切皆对象的语言特征&#xff0c…...

机器学习+深度学习

文章目录 一、机器学习(一)机器学习概念(二)机器学习基本流程(三)机器学习应用场景二、机器学习的常见工具与相关库(一)Python 机器学习库(二)数据处理库(三)可视化库三、聚类算法思想与模型搭建过程(一)K - Means 聚类算法(二)DBSCAN 聚类算法四、分类算法思想…...

docker基本使用命令

一、镜像 1、拉取镜像 docker pull busybox docker pull nginx:1.26-alpine 2、查看本地镜像 [rootRocky-1 ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE nginx latest 4e1b6bae1e48 18 hours ago 192MB busybox lates…...

相机模型--CMOS和CCD的区别

1--CMOS和CCD的工作原理 CCD&#xff08;Charge Coupled Device&#xff0c;电荷耦合器件&#xff09;&#xff1a; 1. 图像通过光电效应在感光单元中转化为电荷&#xff1b; 2. 每个像素上的电荷被依次“耦合”并传输到芯片的角落&#xff0c;通过一个或几个模拟输出放大器输…...

触发器(详解)

一&#xff1a;MySQL触发器 MySQL数据库中触发器是一个特殊的存储过程。 不同的是执行存储过程要使用 CALL 语句来调用&#xff0c;而触发器的执行不需要使用 CALL 语句来调用&#xff0c;也不需要手工启动&#xff0c;只要一个预定义的事件发生就会被 MySQL自动调用。 引发…...

Vue 3 中将 ref 创建的响应式对象数据转换为普通(非响应式)的数据

Vue 3 中使用 ref 创建的响应式对象数据转换为普通&#xff08;非响应式&#xff09;的数据&#xff0c;有以下几种方法&#xff1a; 1. 访问 .value 属性: 这是最直接、最常见的方法。 由于 ref 对象的值存储在其 .value 属性中&#xff0c;直接访问该属性即可获得普通数据。…...

Vue基础(6)_键盘事件

普通键盘事件 键盘事件常用的有两个&#xff1a;keydown、keyup。 举例&#xff1a; <!DOCTYPE html> <html lang"zh"> <head><meta charset"UTF-8"><script type"text/javascript" src"../js/vue.js"&…...

Kubernetes控制平面组件:高可用 APIServer

云原生学习路线导航页&#xff08;持续更新中&#xff09; kubernetes学习系列快捷链接 Kubernetes架构原则和对象设计&#xff08;一&#xff09;Kubernetes架构原则和对象设计&#xff08;二&#xff09;Kubernetes架构原则和对象设计&#xff08;三&#xff09;Kubernetes控…...

这个是我的qss按钮样式 和之前的// 应用全局样式表 QString style = R“(是会冲突吗,导致我的按钮背景颜色是黑色,我该怎么修改

/* 样式 A */ *[style-type="A"] { background-color:#cfd1d4; border: none; border-radius: 50%; /* 圆形边框 */ padding: 7px 14px; } *[style-type="A"]:hover { background-color: #45a049; }这个是我的qss按钮样式 和之前的// 应用全局样式表 QStri…...

Kubernetes控制平面组件:API Server详解(二)

云原生学习路线导航页&#xff08;持续更新中&#xff09; kubernetes学习系列快捷链接 Kubernetes架构原则和对象设计&#xff08;一&#xff09;Kubernetes架构原则和对象设计&#xff08;二&#xff09;Kubernetes架构原则和对象设计&#xff08;三&#xff09;Kubernetes控…...

人工智能在智慧农业中的应用:从田间到餐桌的变革

农业是人类社会的基石&#xff0c;随着全球人口的增长和资源的日益紧张&#xff0c;传统农业面临着巨大的挑战。近年来&#xff0c;人工智能&#xff08;AI&#xff09;技术的快速发展为农业带来了新的机遇。智慧农业通过将AI技术与农业生产相结合&#xff0c;实现了从田间种植…...

多人3D游戏完整实现方案

以下是一份完整的代码实现方案,涵盖架构设计、核心模块实现和部署流程。我们以 多人3D游戏 为例,结合之前讨论的Nano服务端框架和Unity客户端: 技术栈 模块技术选型服务端Golang + Nano框架 + MongoDB客户端Unity 2022 + C# + Mirror Networking通信协议Protobuf + WebSock…...

FFUF指南

ffuf 的核心功能&#xff1a; 目录/文件发现&#xff1a; 通过暴力破解&#xff08;使用字典&#xff09;探测目标网站的隐藏目录或文件&#xff0c;例如&#xff1a; ffuf -w /path/to/wordlist.txt -u http://target.com/FUZZ 子域名枚举&#xff1a; 通过模糊测试发现目标…...

详细的PyCharm安装教程

详细的PyCharm安装教程 安装前准备 确认系统要求&#xff1a; Windows&#xff1a;Microsoft Windows 10 1809 64位或更高版本&#xff0c;Windows Server 2019 64位或更高版本。 macOS&#xff1a;12.0或更高版本。 Linux&#xff1a;满足以下要求的两个最新版本的Ubuntu LTS或…...

FPGA IO引脚 K7-认知4

UG475来知道bank, GTX, Pin数量&#xff0c; Package, Pinout 时钟 ​​SRCC​​&#xff08;Single-Region Clock Capable I/O&#xff09;和​​MRCC​​&#xff08;Multi-Region Clock Capable I/O&#xff09;是专用的时钟输入/输出引脚。 如 2.DQS...

C++——异常

1. C语言错误处理机制 我们在曾经介绍过C语言下的错误码。错误码我们过去经常见到&#xff0c;错误码通常是指errno变量中的值&#xff0c;它表示特定操作&#xff08;如系统调用或库函数&#xff09;发生错误的原因。errno是一个全局变量&#xff0c;当出现错误时会自动将错误…...

vue3 中 iframe 多页面切换导致资源刷新的问题解决

最近发现一个问题&#xff0c;我在使用 websocket 的时候&#xff0c;在主页面进行了 websocket 连接了之后&#xff0c;再使用 iframe 打开子页面的时候&#xff0c;通常会触发页面刷新&#xff0c;这样就导致 WebSocket 断开&#xff0c;这是因为切换 src 会重新加载 iframe …...

php多种方法实现xss过滤

1. 使用 htmlspecialchars() 函数 htmlspecialchars() 是一个PHP内置函数&#xff0c;用于将特殊字符转换为HTML实体&#xff0c;从而防止浏览器将其解释为HTML或脚本代码。 <?phpfunction sanitizeInput($input) {// 将特殊字符转换为HTML实体return htmlspecialchars($…...

蓝桥杯练习题2

动态规划 动态规划三大题型&#xff1a;计数问题、最值问题、存在性问题&#xff1b; 【最小权值】-- 最值问题 【题目分析】 import java.util.Arrays; Arrays类中的一个方法&#xff1a;Arrays.fill(int[] m,int n) //给 int 类型(或者char类型/Long类型...)的数组全部空间…...

Python遥感开发之Hurst指数的实现

Python遥感开发之Hurst指数的实现 主要讲解Python实现Hurst指数&#xff0c;实现遥感下的Hurst指数&#xff0c;对Hurst指数进行分类&#xff0c;以及结合slope指数实现对未来变化趋势的分析。 文章目录 Python遥感开发之Hurst指数的实现0 什么是Hurst指数1 Python实现Hurst指…...

opencv 给图片和视频添加水印

给图片和视频添加水印 1 给图片添加水印2 给视频添加水印 1 给图片添加水印 代码如下&#xff1a; 添加水印 imgcv2.imread(r../15day4.10/src/xiaoren.png) img2cv2.imread(r../15day4.10/src/bg.png) h,w,cimg.shapeRIO_img2img2[100:100h,200:200w]img3cv2.cvtColor(img,…...

国网B接口协议图像数据上报通知接口流程详解以及上报失败原因(电网B接口)

文章目录 一、B接口协议图像数据上报通知接口介绍B.13.1 接口描述B.13.2 接口流程B.13.3 接口参数B.13.3.1 SIP头字段B.13.3.2 SIP响应码B.13.3.3 XML Schema参数定义 B.13.4 消息示例B.13.4.1 图像数据上报请求B.13.4.2 图像数据上报响应 二、B接口图像数据上报通知失败常见问…...

Redis(持久化)

目录 一 Redis持久化的方式 1. RDB(Redis Database) 2. AOF(Append Only File) 二 对比RDB/AOF 为什么要持久化 Redis是跑在内存上的&#xff0c;但内存上的数据是临时的&#xff0c;Redis服务挂了&#xff0c;数据也就丢失了&#xff0c;所以为了解决上述问题&#xff0c;R…...

Linux系统中的网络管理

1.RHEL9版本中&#xff0c;使用nm进行网络配置&#xff0c;ifcfg不再是网络配置文件的主存储&#xff0c;样式仍然可用&#xff0c;但它不再是NetworkManger存储新网络配置文件的默认位置&#xff0c;RHEL以key-file格式在etc/NetworkManger/system-connections/中存储新的网络…...

【深度学习—李宏毅教程笔记】Transformer

目录 一、序列到序列&#xff08;Seq2Seq&#xff09;模型 1、Seq2Seq基本原理 2、Seq2Seq模型的应用 3、Seq2Seq模型还能做什么&#xff1f; 二、Encoder 三、Decoder 1、Decoder 的输入与输出 2、Decoder 的结构 3、Non-autoregressive Decoder 四、Encoder 和 De…...

关于UE5的抗锯齿和TAA

关于闪烁和不稳定现象的详细解释 当您关闭抗锯齿技术时&#xff0c;场景中会出现严重的闪烁和不稳定现象&#xff0c;尤其在有细节纹理和小物体的场景中。这种现象的技术原因如下&#xff1a; 像素采样问题 在3D渲染中&#xff0c;每个像素只能表示一个颜色值&#xff0c;但…...

交换网络基础

学习目标 掌握交换机的基本工作原理 掌握交换机的基本配置 交换机的基本工作原理 交换机是局域网&#xff08;LAN&#xff09;中实现数据高效转发的核心设备&#xff0c;工作在 数据链路层&#xff08;OSI 模型第二层&#xff09;&#xff0c;其基本工作原理可概括为 “学习…...

AUTOSAR图解==>AUTOSAR_SWS_EFXLibrary

AUTOSAR 扩展定点数学函数库(EFX)分析 1. 概述 AUTOSAR (AUTomotive Open System ARchitecture) 是汽车电子控制单元(ECU)软件架构的开放标准。在AUTOSAR架构中&#xff0c;扩展定点数学函数库(Extended Fixed-point library, EFX)提供了一组优化的定点数学运算函数&#xff…...

六边形棋盘格(Hexagonal Grids)的坐标

1. 二位坐标转六边形棋盘的方式 1-1这是“波动式”的 这种就是把【方格子坐标】“左右各错开半个格子”做到的 具体来说有如下几种情况 具体到庙算平台上&#xff0c;是很巧妙的用一个4位整数&#xff0c;前两位为x、后两位为y来进行表示 附上计算距离的代码 def get_hex_di…...

李宏毅NLP-5-RNNTNeural TransducerMoChA

RNN Transducer(RNN-T) 循环神经对齐器&#xff08;RNA&#xff0c;Recurrent Neural Aligner&#xff09;对CTC解码器的改进&#xff0c;具体内容如下&#xff1a; “RNA”&#xff0c;全称 “Recurrent Neural Aligner”&#xff0c;引用来自 [Sak, et al., INTERSPEECH’17…...

GPT-SoVITS 使用指南

一、简介 TTS&#xff08;Text-to-Speech&#xff0c;文本转语音&#xff09;&#xff1a;是一种将文字转换为自然语音的技术&#xff0c;通过算法生成人类可听的语音输出&#xff0c;广泛应用于语音助手、无障碍服务、导航系统等场景。类似的还有SVC&#xff08;歌声转换&…...

洛谷的几道题

P1000 超级玛丽游戏 # P1000 超级玛丽游戏 ## 题目背景 本题是洛谷的试机题目&#xff0c;可以帮助了解洛谷的使用。 建议完成本题目后继续尝试 [P1001](/problem/P1001)、[P1008](/problem/P1008)。 另外强烈推荐[新用户必读帖](/discuss/show/241461)。 ## 题目描述 …...

利用yakit充实渗透字典

前言 在渗透侧测试结束&#xff0c;在我们的历史记录中会保存过程中的数据包。在其中有些特征&#xff0c;比如API、参数&#xff0c;可以活用于下次的渗透。 比如 fuzz变量&#xff0c;fuzz隐藏API…… 但是我们一个一个提取很麻烦&#xff0c;可以使用yakit的插件&#xf…...

精益数据分析(4/126):开启数据驱动的创业之旅

精益数据分析&#xff08;4/126&#xff09;&#xff1a;开启数据驱动的创业之旅 在创业的浪潮中&#xff0c;我们都怀揣着梦想&#xff0c;渴望找到那条通往成功的道路。作为一名在创业和数据分析领域摸爬滚打多年的“老兵”&#xff0c;我深知其中的艰辛与挑战。今天&#x…...

机器学习误差图绘

机器学习误差图绘制 绘图类 # Define the ModelComparisonPlot class class ModelComparisonPlot:def __init__(self, model_name):self.model_name model_namedef plot_comparison(self, y_val, y_pred, mse, mae, r2):# Create a figure with two subplotsfig, axes plt.…...

企业级RAG选择难题:数据方案的关键博弈

企业级RAG选择难题&#xff1a;数据方案的关键博弈 向量数据库&#xff1a;高效但易失语境图数据库与知识图谱&#xff1a;关系网络的力量企业级RAG数据方案的最佳实践 智能时代&#xff0c;企业数据每日剧增。员工寻找答案的效率直接影响工作流程&#xff0c;StackOverflow调查…...

JNI 学习

1. JNI 不属于 C&#xff0c;而是 JDK 的 日志失效&#xff0c;可以 adb kill-server adb kill-serveradb start-server 使用 jni final和 private变量都能修改...

PyTorch :优化的张量库

PyTorch 是一个基于 Python 的开源机器学习框架&#xff0c;由 Facebook 的 AI 研究团队&#xff08;现 Meta AI&#xff09;于 2016 年推出。它专为深度学习设计&#xff0c;但也可用于传统的机器学习任务。PyTorch 的核心优势在于​​灵活性​​、​​动态计算图​​和​​易…...

DevOps 进阶指南:如何让工作流更丝滑?

DevOps 进阶指南:如何让工作流更丝滑? 引言 在 DevOps 世界里,我们追求的是高效、稳定、自动化。但现实总是充满挑战:代码部署失败、CI/CD 过程卡顿、环境不一致……这些痛点让开发和运维团队疲惫不堪。今天,我就来聊聊如何优化 DevOps 工作流,通过实战案例和代码示例,…...

BT-Basic函数之首字母XY

BT-Basic函数之首字母XY 文章目录 BT-Basic函数之首字母XYXxd__ commands Yyes X xd__ commands 当使用外部设备时&#xff0c;开发人员需要在测试计划中添加适当的命令来控制这些设备。下表显示了一个典型的命令序列。 典型的命令序列 NO命令描述1xdload将DLL加载到内存中…...

6. 话题通信 ---- 使用自定义msg,发布方和订阅方cpp,python文件编写

1)在功能包下新建msg目录&#xff0c;在msg目录下新建Person.msg,在Person.msg文件写入&#xff1a; string name uint16 age float64 height 2)修改配置文件 2.1) 功能包下package.xml文件修改 <build_depend>message_generation</build_depend><exec_depend…...

Fastdata极数:全球AR/VR行业发展趋势报告2025

科技的快速发展孕育了一个新的数字前沿领域&#xff0c;那就是虚拟宇宙&#xff0c;也就是我们谈论的元宇宙&#xff08;Metaverse&#xff09;&#xff0c;虚拟宇宙最初构思于尼尔斯蒂芬森的科幻小说《雪崩》中&#xff0c;小说中虚拟宇宙由虚拟人物居住&#xff0c;并以数字方…...

背包 DP 详解

文章目录 背包DP01 背包完全背包多重背包二进制优化单调队列优化 小结 背包DP 背包 DP&#xff0c;说白了就是往一个背包里扔东西&#xff0c;求最后的最大价值是多少&#xff0c;一般分为了三种&#xff1a;01 背包、完全背包和多重背包。而 01 背包则是一切的基础。 01 背包…...

深入剖析 HashMap:内部结构与性能优化

深入剖析 HashMap&#xff1a;内部结构与性能优化 引言 HashMap 是 Java 集合框架中的核心类&#xff0c;广泛应用于数据存储和检索场景。本文将深入剖析其内部结构&#xff0c;包括数组、链表和红黑树的转换机制&#xff0c;帮助读者理解其工作原理和性能优化策略。 1. Hash…...

数据从辅存调入主存,页表中一定存在

在虚拟内存系统中&#xff0c;​数据从辅存调入主存时&#xff0c;页表中一定存在对应的页表项&#xff0c;但页表项的「存在状态」会发生变化。以下是详细分析&#xff1a; 关键逻辑 ​页表的作用 页表是虚拟内存的核心数据结构&#xff0c;记录了虚拟地址到物理地址的映射关系…...

藏品馆管理系统

藏品馆管理系统 项目简介 这是一个基于 PHP 开发的藏品馆管理系统&#xff0c;实现了藏品管理、用户管理等功能。 藏品馆管理系统 系统架构 开发语言&#xff1a;PHP数据库&#xff1a;MySQL前端框架&#xff1a;BootstrapJavaScript 库&#xff1a;jQuery 目录结构 book/…...

力扣算法ing(60 / 100)

4.19 回溯合集—93复原ip地址 有效 IP 地址 正好由四个整数&#xff08;每个整数位于 0 到 255 之间组成&#xff0c;且不能含有前导 0&#xff09;&#xff0c;整数之间用 . 分隔。 例如&#xff1a;"0.1.2.201" 和 "192.168.1.1" 是 有效 IP 地址&…...

时态--06--现在完成時

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 现在完成時1.语法1.肯定句2.否定句3.疑问句4.have been/gone to5.现在分词 practice 现在完成時 1.语法 1.肯定句 2.否定句 3.疑问句 4.have been/gone to 5.现在分…...