程序/进程替换(讲解)

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


进程替换的引进!

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

进程替换的概念!

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

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

进程替换的实例

多进程的进程替换!

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

通过上图我们可以看出结果!子进程开始跑之后,调用了一个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()操作即可!


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

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

cmake和vscode 下的cmake的使用详解(一)。

本文的内容 参考如下内容。 1.【基于VSCode和CMake实现C/C开发 | Linux篇】https://www.bilibili.com/video/BV1fy4y1b7TC?vd_source0ddb24a02523448baa69b0b871ab50f7 2.Notion – The all-in-one workspace for your notes, tasks, wikis, and databases. 3.关于如何利用…

【Vulnhub靶机】Jarbas--Jenkins

文章目录 信息收集主机发现端口扫描目录爆破 漏洞探测whatwebhash-identifierwhatweb 文档说明:https://www.vulnhub.com/entry/jarbas-1,232/ 靶机下载:Download (Mirror): 信息收集 主机发现 扫描C段 sudo nmap -sn 10.9.75.0/24端口扫描 sudo nma…

大数据分析与应用实验任务十

大数据分析与应用实验任务十 实验目的: 通过实验掌握spark SQL的基本编程方法; 熟悉RDD到DataFrame的转化方法; 通过实验熟悉spark SQL管理不同数据源的方法。 实验任务: 进入pyspark实验环境,在桌面环境打开jup…

mockito加junit gd 单元测试 笔记

目录 一、简介1.1 单元测试的特点1.2 mock类框架使用场景1.3 常用mock类框架1.3.1 mockito1.3.2 easymock1.3.3 powermock1.3.4 JMockit 二、mockito的单独使用2.1 mock对象与spy对象2.2 初始化mock/spy对象的方式2.3 参数匹配2.4 方法插桩2.5 InjectMocks注解的使用断言工具 三…

数字图像处理(实践篇)二 画出图像中目标的轮廓

目录 一 涉及的OpenCV函数 二 代码 三 效果图 一 涉及的OpenCV函数 contours, hierarchy cv2.findContours(image, mode, method[, contours[, hierarchy[, offset ]]]) image:源图像。mode:轮廓的检索方式。cv2.RETR_EXTERNAL(只检测…

hive创建ES外部表过程中的问题

一、缺少jar包:httpclient 报错: “HiveServer2-Handler-Pool: Thread-696” java.lang.NoClassDefFoundError: org/apache/commons/httpclient/protocol/ProtocolSocketFactory 需要加载commons-httpclient-3.1.jar 二、缺少jar包:eshado…

Vue.js 组件生命周期

Vue.js 组件生命周期 生命周期函数(钩子)就是给我们提供了一些特定的时刻,让我们可以在这个周期段内加入自己的代码,做一些需要的事情; 生命周期钩子中的this指向是VM 或 组件实例对象 在JS 中,函数的执行上下文&#…

Kubernetes 安全最佳实践:保护您的秘密

Kubernetes 是一个可用于微服务的开源容器编排平台。当我们想要部署容器化应用程序、自动化管理和扩展应用程序时,Kubernetes 非常有用。 在容器中运行单个微服务而不是在同一虚拟机中运行多个进程几乎总是更安全。每当我们在 Kubernetes 中启动任何 pod 时&#x…

AndroidStudio2022.3.1 Patch3使用国内下载源加速

记录一下这个版本的as在使用国内下载源加速碰到的诸多问题。 一、gradle-8.0-bin.zip下载慢 编辑项目文件夹/gradle/wrapper/gradle-wrapper.properties,文件内容改为如下: #Fri Nov 24 18:50:06 CST 2023 distributionBaseGRADLE_USER_HOME distribu…

linux服务器环境搭建(使用yum 安装mysql、jdk、redis)

一:yum的安装 1:下载yum安装包并解压 wget http://yum.baseurl.org/download/3.2/yum-3.2.28.tar.gz tar xvf yum-3.2.28.tar.gz 2.进入yum-3.2.28文件夹中进行安装,执行安装指令 cd yum-3.2.28 sudo apt install yum 3.更新版本 yum check-update yum update yum cle…

Open3D 点对点的ICP配准算法

一、主要函数 1、该类TransformationEstimationPointToPoint提供用于计算点对点ICP目标函数的残差和雅可比矩阵的函数。函数registration_icp将其作为参数并运行点对点ICP以获得结果。 2、该函数evaluate_registration计算两个主要指标。fitness计算重叠区域(内点对…

服务器之间的conda环境迁移

有的时候python环境中可能包含了我们编译好的很多库文件,如果在别的服务器想直接使用环境就会比较困难些。最好的办法就是直接迁移环境。而传统的迁移方法导出“*.yaml”环境配置的这种方法,实际是需要重新安装环境,对于这种安装好的环境是不…

【排序,直接插入排序 折半插入排序 希尔插入排序】

文章目录 排序排序方法的分类插入排序直接插入排序折半插入排序希尔插入排序 排序 将一组杂乱无章的数据按照一定规律排列起来。将无序序列排成一个有序序列。 排序方法的分类 储存介质: 内部排序:数据量不大,数据在内存,无需…

PHP在线日语学习平台

有需要请加文章底部Q哦 可远程调试 PHP在线日语学习平台 一 介绍 此日语学习平台基于原生PHP开发,数据库mysql。系统角色分为用户和管理员。(附带参考设计文档) 技术栈:phpmysqlphpstudyvscode 二 功能 学生 1 注册/登录/注销 2 个人中心 3 查看课程…

首次部署Linux系统的经历

我是一名电子信息工程专业的学生,有次在图书馆上自习的时候无意间看到其他同学的电脑屏幕,黑色的屏幕上显示着一行一行的代码,勾起了我无限的好奇,经过询问得知他是用的Linux操作系统,是和Windows完全不同的系统&#…

记RocketMQ本地开发环境搭建始末

前言 最近工作中涉及到了RocketMQ的应用,为方便开发决定本地搭建一套RocketMQ的使用环境。 果然实践是个好东西... VMware虚拟环境搭建 这个网上有很多教程,只会比我写的详细有条理,这里就不在赘述了。 虚拟机搭建好之后每次重启电脑都无…

智能优化算法应用:基于风驱动算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用:基于风驱动算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用:基于风驱动算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.风驱动算法4.实验参数设定5.算法结果6.参考文献7.…

vue3实现element table缓存滚动条

背景 对于后台管理系统,数据的展示形式大多都是通过表格,常常会出现的一种场景,从表格跳到二级页面,再返回上一页时,需要缓存当前的页码和滚动条的位置,以为使用keep-alive就能实现这两种诉求,…

threeJs引入模型使用3D模型(vite+React+Ts)

要在 Three.js 中使用 3D 模型,你需要加载模型文件并将其添加到场景中。Three.js 支持多种不同的模型格式,比如 OBJ、FBX、GLTF 等。 init vitelatest //创建一个vite的脚手架 选择react并配置Ts 安装three.js准备 npm install react-three/drei np…

阿里云新版公共实例从注册账号到创建设备生成参数教程

1 注册阿里云 打开阿里云官网,点击右上角的登录/注册 打开的界面按照图片输入手机号注册 注册成功后,登录返回第一次打开的界面,点击控制台 点击控制台后界面如下 点击左上角的菜单,弹出新窗口,搜索物联网平台 开通物…