【Linux】进程的程序替换

news2025/1/20 16:19:15

前言:

在未进行进程的程序替换时,父子进程的数据是独立的通过页表进行映射进行实现进程数据的独立性,但是父子进程的代码还是共享的,我父进程将子进程进行创建出来不仅仅只会有父子进程只进行执行共享代码的需求,有的时候需要让子进程进行单独的去执行独立的一份代码,此时这种情况下是如何进行设计的呢?通过了解进程的程序替换就可以豁然开朗。

什么是进程的程序替换?

进程程序替换的该概念和原理

进程的程序替换就是让子进程和父进程执行不同的代码,实现父子进程数据和代码的全部独立,父子进程代码的独立性也是通过页表的重新进行映射实现的。代码仅从重新加载到内存中通过页表重新建立映射关系,程序地址替换也完成了代码的写实拷贝。

进程的程序替换是如何进行的?

通过exec系列的函数进行完成的。

exec系列的函数实际上就是将磁盘中的代码和数据进行加载到内存中形成进程。

查看进程替换函数

man 3 exec

进程替换函数的解析


进程替换函数的返回值是只有出现错误时才会返回-1,进行进程替换成功时是没有返回值的。为什么进程替换成功会没有返回值,我们在下面进行解释。

下面都是通过

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

这里的l是list的意思

参数说明

path是进程替换后想要进行执行新程序的路径,这里可以是绝对路径和相对路径(要进行执行一个新的程序首先需要先进行找到程序,因此需要首先需要进行传路径)

arg是函数的参数列表,... 代表代表参数的可变参数列表,可以根据传入的参数进行自动识别参数的个数,第一个参数一般是程序名,后续通常是这个程序的参数列表,最后以NULL进行结尾。

当子进程通过程序替换函数进行程序替换时,execl函数后面的代码是没有被子进程进行执行的,子进程在执行程序替换时,程序替换函数后面的代码就被替换掉了,被替换掉的包括execl程序替换函数的返回值,这就是为什么进程替换成功后,进程替换函数没有返回值的原因,也是父进程进行进程等待拿到子进程退出码依然是0的原因。

当通过exec系列函数进行进行调用python语言时的文件时,首先需要进行传入python解释器的路径,然后是解释器的名称,接着是文件名,最后还是以NULL进行结尾。

execv(const char* path, const char*argv[ ])

execv函数和execl函数进行对比区别只有程序进行时传递给新程序的参数列表的方式不同,这里‘v’是代表vector的意思,通过数组进行接收传递的参数列表

execlp(const char* file, const char*arg, ...)

这里和execl相比,这里函数名中带来一个p,这里的p是PATH的意思,是环境变量,所以说当新的程序路径放到环境变量中时,不需要进行传地址,只需要进行传环境变量名即可

execvp(const char* file, const char*argv[])

直接通过环境变量的来进行查找解释器的位置

execle(const char* path, const char*arg, ...
                        ...,char* const envp[  ])

execve(const char* filename , char *const argv[  ] , char* const envp[  ])

execve这个函数和上面的函数是不同的,execve 是最基础的 exec 系统调用,它直接向操作系统请求替换当前进程的映像。其他的 exec 函数(如 execl, execp, execvp, execv 等)通常是对 execve 的封装,提供了更加方便、简洁的接口。

模拟实现shell程序外壳程序

框架的设计思路:

首先shell外壳程序是始终不退出的,需要进行一个死循环,然后通过两个数组进行存储我们键盘输入的命令,其中cmd_line用于存储未被打散的整个命令,注意这个cmd_line数组的类型是char类型,用char类型的原因是存储整个命令方便后续gets进行读取,用g_argv数组用于存储打散的字符串。通过memset进行初始化cmd_line数组,通过fgets函数进行在流输入(键盘中)读取完整命令存在于cmd_line数组中,fgets函数读取完整命令时我们通过回车键进行命令的完成也会被读取到,通过将'\n'→'\0'防止空格一行的出现,然后通过strtok函数将cmd_line函数中的完整命令打散放入g_argv中,然后通过fork函数进行创建子进程运用程序替换进行执行操作。

myshell程序外壳的框架(代码的实现)

一些疑惑的解决

为什么要通过创建子进程让子进程通过程序替换进行执行命令,而不是直接通过父进程进行执行命令???

首先这里进行执行命令不都是系统命令,也有可能是我们编写的程序通过编译后形成的可执行程序的运行,回顾一下我们在window系统下,通过IDE进行编写代码时,都经常出现代码跑挂了的情况,如果让父进程直接执行命令,IDE进程就直接挂掉了,给我们的主观感受就是进程闪退了,再比如我们来leetcode进行刷算法题时,当我们的代码写崩了时,leetcode进程也没有崩掉,也就是说我们进行执行OJ 的也是leetcode父进程创建的子进程。

为什么通过cd ..命令时不会进行当前路径的移动??

因为cd是内部命令,执行内部命令的是shell外壳程序本身,也就是父进程执行内部命令,子进程是没有进行进行执行cd 命令的,并且pwd是属于外部命令,通过pwd执行的是子进程的路径,所以说pwd进行执行时路径是未发生变化的。

处理方法:

如何做到支持命令的简写

例如"ls -l"→"ll"

子进程是如何进行继承父进程的环境变量的??

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2279440.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java测试开发平台搭建(九)前端

1. 搭建前端vue环境 Vue3 安装 | 菜鸟教程 2. 创建项目 1.进入ui vue ui 2. create项目 3. 成功之后添加插件: cli-plugin-router vue-cli-plugin-vuetify 4. 添加依赖 axios 5. 点击任务开始运行 如果报错: 修改vue.config.jsconst { defineConfig }…

Asp .Net Core 实现微服务:集成 Ocelot+Nacos+Swagger+Cors实现网关、服务注册、服务发现

什么是 Ocelot ? Ocelot是一个开源的ASP.NET Core微服务网关,它提供了API网关所需的所有功能,如路由、认证、限流、监控等。 Ocelot是一个简单、灵活且功能强大的API网关,它可以与现有的服务集成,并帮助您保护、监控和扩展您的…

【机器学习实战入门】使用Pandas和OpenCV进行颜色检测

Python 颜色检测项目 今天的项目将非常有趣和令人兴奋。我们将与颜色打交道,并在项目过程中学习许多概念。颜色检测对于识别物体来说是必要的,它也被用作各种图像编辑和绘图应用的工具。 什么是颜色检测? 颜色检测是检测任何颜色名称的过程…

如何实现文本相关的显示功能

文章目录 1 概念介绍2 使用方法3 示例代码 我们在上一章回中介绍了页面之间传递数据相关的内容,本章回中将介绍如何使用Text Widget。闲话休提,让我们一起Talk Flutter吧。 1 概念介绍 我们在这里说的Text Widget就是显示文字内容的组件,其实我们一直在…

精度论文:【Focaler-IoU: More Focused Intersection over Union Loss】

Focaler-IoU: 更聚焦的交并比损失 Focaler-IoU: More Focused Intersection over Union Loss Focaler-IoU: 更聚焦的交并比损失I. 引言II. 相关工作III. 方法IV. 实验V. 结论 原文地址:官方论文地址 代码地址:官方代码地址 摘要——边界框回归在目标检…

计算机组成原理--笔记二

目录 一.计算机系统的工作原理 二.计算机的性能指标 1.存储器的性能指标 2.CPU的性能指标 3.系统整体的性能指标&#xff08;静态&#xff09; 4.系统整体的性能指标&#xff08;动态&#xff09; 三.进制计算 1.任意进制 > 十进制 2.二进制 <> 八、十六进制…

BERT与CNN结合实现糖尿病相关医学问题多分类模型

完整源码项目包获取→点击文章末尾名片&#xff01; 使用HuggingFace开发的Transformers库&#xff0c;使用BERT模型实现中文文本分类&#xff08;二分类或多分类&#xff09; 首先直接利用transformer.models.bert.BertForSequenceClassification()实现文本分类 然后手动实现B…

MySQL - 主从同步

​​​​​​1.主从同步原理&#xff1a; MySQL 主从同步是一种数据库复制技术&#xff0c;它通过将主服务器上的数据更改复制到一个或多个从服务器&#xff0c;实现数据的自动同步。 主从同步的核心原理是将主服务器上的二进制日志复制到从服务器&#xff0c;并在从服务器上执…

[Python学习日记-78] 基于 TCP 的 socket 开发项目 —— 模拟 SSH 远程执行命令

[Python学习日记-78] 基于 TCP 的 socket 开发项目 —— 模拟 SSH 远程执行命令 简介 项目分析 如何执行系统命令并拿到结果 代码实现 简介 在Python学习日记-77中我们介绍了 socket 基于 TCP 和基于 UDP 的套接字&#xff0c;还实现了服务器端和客户端的通信&#xff0c;本…

STM32Cubemx配置RS485通信

文章目录 一、RS485协议概念讲解RS485 协议概念1. **差分信号传输**2. **半双工通信**3. **多点通信**4. **最大通信距离和速度**5. **终端电阻与偏置电阻**6. **RS485 接口的工作模式**7. **RS485 协议的数据帧结构**8. **RS485 的优点与应用** 总结 二、TTL电平和RS485的关系…

STM32使用DSP库 Keil方式添加

文章目录 前言一、添加DSP库二、使能FPU及配置1. 使能FPU2. 增加编译的宏3.增加头文件的检索路径三. 验证1. 源码中添加2.代码测试前言 添加DSP有两种方案,本文采用的是是Keil 中添加。 一、添加DSP库 在创建好的工程中添加DSP库:步骤如下: 步骤1:选择运行环境管理; 步…

Kotlin Bytedeco OpenCV 图像图像54 透视变换 图像矫正

Kotlin Bytedeco OpenCV 图像图像54 透视变换 图像矫正 1 添加依赖2 测试代码3 测试结果 在OpenCV中&#xff0c;仿射变换&#xff08;Affine Transformation&#xff09;和透视变换&#xff08;Perspective Transformation&#xff09;是两种常用的图像几何变换方法。 变换方…

【Flink系列】10. Flink SQL

10. Flink SQL Table API和SQL是最上层的API&#xff0c;在Flink中这两种API被集成在一起&#xff0c;SQL执行的对象也是Flink中的表&#xff08;Table&#xff09;&#xff0c;所以我们一般会认为它们是一体的。Flink是批流统一的处理框架&#xff0c;无论是批处理&#xff08…

【STM32-学习笔记-11-】RTC实时时钟

文章目录 RTC实时时钟一、RTC简介二、RTC框图三、RTC基本结构四、RTC操作注意事项五、RTC函数六、配置RTCMyRTC.c 七、示例&#xff1a;实时时钟①、main.c②、MyRTC.c③、MyRTC.h RTC实时时钟 一、RTC简介 RTC&#xff08;Real Time Clock&#xff09;实时时钟 RTC是一个独立…

Spring的IoC、Bean、DI的简单实现,难度:※※※

目录 场景描述 第一步&#xff1a;初始化Maven项目 第二步&#xff1a;Maven导入Spring包&#xff08;给代码&#xff09; 第三步&#xff1a;创建Spring配置文件 第四步 创建Bean 第五步 简单使用Bean &#xff08;有代码&#xff09; 第六步 通过依赖注入使用Bean&…

Tensor 基本操作1 | PyTorch 深度学习实战

目录 创建 Tensor常用操作unsqueezesqueezeSoftmax代码1代码2代码3 argmaxitem 创建 Tensor 使用 Torch 接口创建 Tensor import torch参考&#xff1a;https://pytorch.org/tutorials/beginner/basics/tensorqs_tutorial.html 常用操作 unsqueeze 将多维数组解套&#xf…

自然语言处理——自注意力机制

一、文字表示方法 在自然语言处理中&#xff0c;如何用数据表示文字是基础问题。独热编码&#xff08;One-hot Encoding &#xff09;是一种简单的方法&#xff0c;例如对于 “我”“你”“他”“猫”“狗” 等字&#xff0c;会将其编码为如 “我 [1 0 0 0 0 ……]”“你 [0 …

嵌入式硬件篇---PID控制

文章目录 前言第一部分&#xff1a;连续PID1.比例&#xff08;Proportional&#xff0c;P&#xff09;控制2.积分&#xff08;Integral&#xff0c;I&#xff09;控制3.微分&#xff08;Derivative&#xff0c;D&#xff09;控制4.PID的工作原理5..实质6.分析7.各种PID控制器P控…

学成在线_内容管理模块_创建模块工程

学成在线模块工程 1.各个微服务依赖基础工程2.每个微服务都是一个前后端分离的项目3.xuecheng-plus-content&#xff1a;内容管理模块工程xuecheng-plus-content-modelxuecheng-plus-content-servicexuecheng-plus-content-api 1.各个微服务依赖基础工程 2.每个微服务都是一个前…

免费送源码:Java+ssm+MySQL Springboot卫生院儿童预防接种系统 计算机毕业设计原创定制

摘 要 儿童预防接种工作实行网络信息化管理&#xff0c;是我国预防规划工作发展的需要。接种信息实行网络信息化不仅是预防接种工作步入了一个新的台阶&#xff0c;更重要的是解决了多年接种疫苗过程种&#xff0c;预防接种剂次不清&#xff0c;难以全程有效接种的问题&#x…