程序/进程替换(讲解)

本文旨在讲解进程替换的知识!希望读完本文,能使读者对进程替换有更深一步的认识!!好的,废话不多说,干货来了!


进程替换的引进!

为什么要引进进程替换呢?我们创建子进程总不能做和父进程做一样的事情把!子进程也应该能做自己想做的事情吧!就拿我们日常生活中的例子来言:一个父亲经营一家公司,其儿子也不一定非得子承父业来选择和其父亲做一样的事情把。所以这就把进程替换这个概念引了进来!

进程替换的概念!

何谓进程替换呢?进程替换就是子进程不再运行父进程的代码和数据了,而是另起炉灶,选择新的代码和数据来执行!

既然进程替换的概念已经简单的介绍了,那么我们就来见一见进程替换把!

进程替换的实例

多进程的进程替换!

下面通过一个简单的多进程的代码来看一看什么是进程替换!

通过上图我们可以看出结果!子进程开始跑之后,调用了一个execl函数!然后父进程一直在跑!等待子进程的退出!最后通过监视进程窗口看见,子进程跑完了,但是子进程跑的代码是我们日常命令行中的ls命令?这难道进行进程替换么?

也有眼尖的小伙伴发现了,直至子进程退出之后,也没有执行其execl之后的代码!这是为什么?而且进程替换之后也没有创建新的进程!从这点我们可以看出,进程的替换并不会引起新的进程的产生!

那么为什么excel之后的代码就不再执行了呢?这就要从进程替换的原理来讲解了!

所谓的进程替换,本质上只是将子进程的代码和数据块进行了修改,其他的结构 并没有做出修改!那么是如何修改的呢?是从磁盘中获取新的代码和数据块,然后在内存中重新找空间,用于这些新的代码和数据块,然后修改子进程从父进程那边继承过来的页表的信息,简单的进程替换就做完了!


那么知道了原理,那该如何解释是如何进行进程替换的呢?

通过上面的调用execl函数可以看出,首先要找到被替换的可执行程序,然后进行选择如何执行这个程序即可!

要想彻底搞懂进程的替换原理,那么我们就不得不介绍系统提供的进程替换函数了!

进程替换函数讲解

通过上图我们可以看出进程替换有很多,他们都是在第三手册(也就是系统调用),下面我们就来详细介绍其中的一些函数!已经他们的使用方法!

execl

函数原型:

其中exec是这些函数的开头,l可以理解成list的意思,即用list传递参数!

可以看出,有两个参数!根据我们刚才多进程的进程替换的实例中,我们可以看出,其中第一个path就是替换后的程序的路径与文件名  其中第二个参数就是我们日常在bash命令行中怎么写,就在函数传参怎么写就行!后面的三个点代码此函数是一个可变参数列表!表示参数不固定!但是需要注意的是:最后必须以NULL结尾,表示传参完毕!


execlp

函数原型:

其中exelc中的p代表的是PATH,即系统默认的PATH环境变量,所以第一个参数为file,表明只需要写你要替换的程序的名字即可!其中第二个参数上面execl中相同!

下面来看一下此函数的使用方式!

其中第一个参数,只需要将替换后程序的名字写上去就行,无需再进行声明路径即可!


execv

函数原型:

其中execv中的v代表的是一个数组,用于存放命令的选项!

下面来简单来看一下此函数的使用方式!

其中只需要创建一个函数指针数组即可,将程序的选项写入到argv数组即可!其中警告原因是因为前面没有用const修饰,因为它们指向的都是字符串常量!切记:此数组中的结尾也必须以NULL结尾,表示传递参数结束!


execvp

函数原型:

其中p代表的仍然是默认的环境变量,与execv的差距只是第一个参数传参不必再进行传路径了,只需要传被替换的程序名字即可!

使用就不再累赘了!

execvpe

函数原型:

其中e表示的环境变量!

表示该函数继承其父进程的环境变量,其中第三个参数指的是环境变量参数,可以传递系统自带的environ,或者自己自定义的环境变量的字符串指针数组!

具体使用如下:

只要将其中的参数进行正确的传参即可!其中第一个参数,也可以直接将arg[0]传入,第二个传的就命令行参数,第三个就环境变量参数,可以自己定义,也可以传系统自带的environ!


至此,将部分的exec簇家族的函数讲解一番,其他的函数只需要对照其上述的函数使用方式即可!

扩充:

但是当我们进行查找2号手册的时候,我们还会发现还有一个exel簇函数,它为什么在2号手册,和这些簇函数不同呢?

下面我们看一下2号手册的exec函数!

他为什么处于二号手册呢,这里简单介绍一番,其中位于三号手册的系统调用本质上都是调用的此函数!都是对本函数的封装!这是为什么呢?因为每次进程替换的时候,格式不确定,所以不能仅仅通过此函数来调用,因此就封装了这个函数,产生了位于三号手册的那些exec簇函数!


通过上述的进程替换我们可以看出,进程替换替换的都是bash命令行已经存在的命令,那么是否能够替换成我们自己写的程序呢?答案是肯定的!下面我就来写一个代码替换为我们自己写的C++进程!

Makefile

mytest.cc

运行之后,就可以看到将我们的代码替换成c++运行的代码了!

进程替换中环境变量的变化!

1.在进行进程替换的时候,子进程对应的环境变量,可以直接从父进程那边继承过来!  可以使用export新增导入环境变量观察即可!

2.环境变量被子进程继承下来是一种默认的行为不受程序替换的影响!(因为程序替换只是简单的替换代码和数据段,然后修改页表中的部分内容,对虚拟地址空间也是直接拷贝过来!)

3.子进程获取环境变量的三种方式

一、直接原封不动的由父进程那边继承过来

二、传递自己定义的环境变量参数!

三、新增传递,即原封不动从父进程继承过来之后,再自己进行putenv()操作即可!


至此,关于进行替换的知识介绍完毕,希望能对读者有一定的收获!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

系列十三、SpringBoot的自动配置原理

一、概述 我们知道Java发展到现在功能十分的强大,生态异常的丰富,这里面离开不了Spring及其家族产品的支持,而作为Spring生态的明星产品Spring Boot可以说像王者一般的存在,那么的耀眼,那么的光彩夺目!那么…

QT线程的使用 循环中程序的等待

QT线程的使用 循环中程序的等待 先看效果1 pro文件2 头文件3 源文件4 ui文件先看效果 1 pro文件 QT += concurrent2 头文件 #ifndef MAINWINDOW_H #define MAINWINDOW_H

Vue中 env 文件是如何读取的? 优先级?

Vue中 env 文件是如何读取的? 优先级? start 今天来研究一下 Vue 中 env 是如何读取的。跟着我的脚步来学习一下吧。作者:番茄;编写时间:2023/11/30 前情提要 env,使用方式是process.env。简单来说&…

数学建模-基于脑出血患者院前指标的多种机器学习预测模型构建及比较研究

基基于脑出血患者院前指标的多种机器学习预测模型构建及比较研究 整体求解过程概述(摘要) 卒中是全球致残率、致死率最高的疾病之一,其中脑出血(Intracerebral hemorrhage,ICH)患者仅占卒中患者的 20%,但致残、死亡人…

【深度学习】KMeans中自动K值的确认方法

1 前言 聚类常用于数据探索或挖掘前期,在没有做先验经验的背景下做的探索性分析,也适用于样本量较大情况下的数据预处理等方面工作。例如针对企业整体用户特征,在未得到相关知识或经验之前先根据数据本身特点进行用户分群,然后再…

【腾讯云云上实验室】个人对腾讯云向量数据库的体验心得

目录 前言Tencent Cloud VectorDB概念使用初体验腾讯云向量数据库的优势应用场景有哪些?未来展望番外篇:腾讯云向量数据库的设计核心结语 前言 还是那句话,不用多说想必大家都能猜到,现在技术圈最火的是什么?非人工智…

Spring Security 6.x 系列(7)—— 源码分析之建造者模式

一、建造者模式 WebSecurity、HttpSecurity、AuthenticationManagerBuilder 都是框架中的构建者,把他们放到一起看看他们的共同特点: 查看AuthenticationManagerBuilder的继承结构图: 查看HttpSecurity的继承结构图: 查看WebSec…

Logstash使用指南

介绍 Logstash是一个开源数据收集引擎,具有实时管道功能。它可以动态地将来自不同数据源的数据统一起来,并将数据标准化到你所选择的目的地。尽管Logstash的早期目标是搜集日志,现在它的功能已完全不只于此。任何事件类型都可以加入分析&…

鸿蒙原生应用/元服务开发-开发者如何进行真机测试

前提条件:已经完成鸿蒙原生应用/元服务开发,已经能相对熟练使用DevEco Studio,开发者自己有鸿蒙4.0及以上的真机设备。 真机测试具体流程如下 1.手机打开开发者模式 2.在项目中,左上角 文件(F)->项目结构 进行账号连接 3.运行

智慧配电间(配电室智能监控)

智慧配电间是一种应用物联网、云计算、大数据等先进技术,对配电室进行智能化改造和升级,依托电易云-智慧电力物联网,实现电力设备的实时监控、智能控制和远程管理的解决方案。以下是智慧配电间的主要功能和特点: 实时监控与数据分…

简明指南:使用Kotlin和Fuel库构建JD.com爬虫

概述 爬虫,作为一种自动化从网络上抓取数据的程序,广泛应用于数据分析、信息提取以及竞争对手监控等领域。不同的实现方式和编程语言都能构建出高效的爬虫工具。在本文中,我们将深入介绍如何充分利用Kotlin和Fuel库,构建一个简单…

【蓝桥杯选拔赛真题28】C++口罩分配 第十三届蓝桥杯青少年创意编程大赛C++编程选拔赛真题解析

目录 C/C++口罩分配 一、题目要求 1、编程实现 2、输入输出 二、算法分析 <

IOS/安卓+charles实现抓包(主要解决证书网站无法打开问题)

安装 官网下载 https://www.charlesproxy.com/latest-release/download.do 安装charles文档 流程 上述链接解决下图问题 使用介绍 Charles介绍 上述链接看一至三即可&#xff0c;了解首页各个按钮的作用 charles全面使用教程及常见功能详解&#xff08;较详细&#xff09…

常见智力题汇总

常见智力题汇总 扔瓶子问题扑克牌问题出队问题烧绳子问题赛马问题求出前三名求出前五名 接水问题种树问题硬币问题宝石问题核酸检测问题 笔者最近面试遇到了好几道智力题&#xff0c;这些题目特点就是如果没有见过&#xff0c;很难第一时间思考得到答案&#xff0c;因此笔者面试…

Spire.Office 8.11.2 for NET fix Crack

内容摘自来自互联网------或者SDK官方本身手册 Spire.Doc for .NET A professional Word .NET library designed to create, read, write, convert and print Word document files in any .NET ( C#, VB.NET, ASP.NET, .NET Core, Xamarin ) application with fast and high qu…

常见算法

简单认识算法 什么是算法&#xff1f; 解决某个实际问题的过程和方法&#xff01; 排序算法 冒泡排序 选择排序 冒泡排序 每次从数组中找到最大值放在数组的后面去 import java.util.Arrays;public class Work1 {public static void main(String[] args) {//准备一个数组in…

Windows11如何让桌面图标的箭头消失(去掉快捷键箭头)

在Windows 11中&#xff0c;桌面图标的箭头是快捷方式图标的一个标志&#xff0c;用来表示该图标是一个指向文件、文件夹或程序的快捷方式。如果要隐藏这些箭头&#xff0c;你需要修改Windows注册表或使用第三方软件。 在此之前&#xff0c;我需要提醒你&#xff0c;修改注册表…

Unity3D 导出的apk进行混淆加固、保护与优化原理(防止反编译)

​ 目录 前言&#xff1a; 准备资料&#xff1a; 正文&#xff1a; 1&#xff1a;打包一个带有签名的apk 2&#xff1a;对包进行反编译 3&#xff1a;使用ipaguard来对程序进行加固 前言&#xff1a; 对于辛辛苦苦完成的apk程序被人轻易的反编译了&#xff0c;那就得不偿…

vue之mixin混入

vue之mixin混入 mixin是什么&#xff1f; 官方的解释&#xff1a; 混入 (mixin) 提供了一种非常灵活的方式&#xff0c;来分发 Vue 组件中的可复用功能。一个混入对象可以包含任意组件选项。当组件使用混入对象时&#xff0c;所有混入对象的选项将被“混合”进入该组件本身的…

C++——AVL树

作者&#xff1a;几冬雪来 时间&#xff1a;2023年11月30日 内容&#xff1a;C板块AVL树讲解 目录 前言&#xff1a; AVL树与搜索二叉树之间的关系&#xff1a; AVL树概念&#xff1a; 插入结点&#xff1a; 平衡因子&#xff1a; 旋转&#xff1a; 双旋&#xff1a; …