Linux操作系统——进程控制(三) 进程程序替换

前言

目前我们接触到我们所创建的所有的子进程,它执行的代码都是父进程代码的一部分!那么如果我们想让子进程执行新的程序呢???执行全新的代码和访问全新的数据,不在和父进程有瓜葛,我们该怎么做呢?

这就需要引入一种技术叫做程序替换。

下面我们从这三个方面来介绍程序替换:

1.单进程版的程序替换的代码(没有子进程)--见见程序替换

2.理解和掌握程序替换的原理,更改多进程版的程序替换的代码,扩展理解和掌握多进程程序替换的原理

3.大量的使用其他的程序替换的方法--父子进程场景中

1.初见程序替换

下面我们先通过man手册来看看关于程序替换的一些接口:

 下面我们通过第一个接口execl接口写一段代码来进行说明:

下面我们运行这段代码:

我们竟然神奇的发现,通过该程序我们把我们系统的命令ls -a -l这条命令给执行起来了。但是我们发现有一个现象就是只打印了begin那条语句,而没有打印end那条语句,这是我们目前观察到的现象。

我们再修改成几个其他的系统命令:

top

pwd

上述说明我们可以用"语言"调用其他程序

我们要替换哪一个程序->文件 -- > 程序文件的路径+文件名 --- 先找到

如何执行的问题? 命令行怎么写,就将参数怎么传。

最后一个参数必须以NULL结尾,表示参数传递完毕!

2.程序替换的原理

在这个过程中并没有创建新进程,为什么呢?因为当我们进行程序替换时,我们并没有增加或减少或改变进程的pid,进程的pcb并没有发生改变,发生改变的只是进程PCB中通过进程地址空间通过页表映射到对应物理内存的代码和数据。

下面我们用一个多进程的场景来写程序替换:

上述代码其实是让子进程进行程序替换,而父进程只进行进程阻塞等待。

其实我们前面就说过,父进程创建子进程之后,代码和数据是共享的,如果父子进程中有一个进程需要修改数据的话那么会发生写时拷贝,那么我们上面又说程序替换是将进程的代码和数据进行替换的,那么一旦替换父子进程的代码和数据都会被替换,但是我们这里仅仅只是子进程发生程序替换,父进程不需要发生程序替换,所以这种情况不存在。因为进程具有独立性,所以程序替换代码和数据由于都会被覆盖所以父子进程的代码和数据都会发生写时拷贝。所以多进程发生程序替换需要发生写时拷贝。

而我们这里还是会有疑问:

子进程怎么知道,要从新的程序的最开始执行呢?

其实c语言编译之后会形成可执行程序,而在我们的Linux中可执行程序是以ELF的格式保存的,这里面会有一张表,然后表里面会有一个字段 entry:可执行程序的入口地址。

子进程怎么知道最开始的地方在哪里呢?

我们平常写的代码,代码都是被一行一行执行的,其实我们应该听过一个概念叫做程序计数器,叫做pc指针或者eip,CPU内的寄存器。这种寄存器CPU内只有一个,但是一个寄存器可以保存多套内容,所以每一个进程都有自己私有的eip,其中eip保存的是当前正在执行的指令的下一条指令的地址,所以我们平常c语言遇到的判断,循环,函数调用都是需要修改这个eip的内容的,也就是下一条指令的地址。所以子进程如何知道最开始的地方在哪里,就是通过哪一个进程调用*exec接口,那么程序替换之后就把可执行程序中的一张表中的entry字段填到对应的eip寄存器当中,让其成为下一条指令的地址,这样子进程就能够知道从最开始的地方执行了。

我们上面还有一个现象:发现就是只打印了begin那条语句,而没有打印end那条语句,通过以上结论就能够解释这个现象。

那就是如果我们的进程执行exec*这样的函数成功了,也就是程序替换成功了,那么该进程的代码和数据都会被新的程序的代码和数据给覆盖掉,同时eip保存的下一条指令也会被覆盖,那么此时进程执行的下一条指令的地址就不再是end那条语句了,所以后续代码不会再被执行了。

所以说:调用exec*这样的函数,如果当前进程执行成功,则后续代码没有机会执行了!因为被替换掉了!

exec* 这样的函数只有失败的返回值,没有成功的返回值。失败的返回值是-1.那么如果调用该函数之后还执行后续代码说明程序替换失败了,不用再继续判断,也就是可以看该函数调用后的后续代码是否被执行来判断程序替换是否成功了。

3.程序替换的使用场景

程序替换最基本的要求:

a.必须先找到这个可执行程序

b.必须告诉exec* 函数,怎么执行。

我们的程序替换,既然能替换系统指令程序,那么能替换我们自己写的程序吗?

myprocess.c源文件代码:

mytest.cpp源文件代码:

运行结果:

我们发现程序替换成功了。

exec*执行的操作是将程序替换,那么这不就是将我们前面谈到的一个程序要运行必须先加载到内存的那个过程吗?这还不就是加载器最重要的一个功能吗?

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

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

相关文章

Redis缓存使用问题

数据一致性 只要使用到缓存,无论是本地内存做缓存还是使用 redis 做缓存,那么就会存在数据同步的问题。 以 Tomcat 向 MySQL 中写入和删改数据为例,来解释数据的增删改操作具体是如何进行的。 我们分析一下几种解决方案, 1、先更新缓存,再更新数据库 2、先更新数据库,…

【JVM】本地方法接口 Native Interface

一、JNI简介 JVM本地方法接口(Java Native Interface,JNI)是一种允许Java代码调用本地方法(如C或C编写的方法)的机制。这种技术通常用于实现高性能的计算密集型任务,或者与底层系统库进行交互。 二、JNI组…

Zynq 电源

ZYNQ芯片的电源分PS系统部分和PL逻辑部分,两部分的电源分别是独立工作。PS系统部分的电源和PL逻辑部分的电源都有上电顺序,不正常的上电顺序可能会导致ARM系统和FPGA系统无法正常工作。 PS部分的电源有VCCPINT、VCCPAUX、VCCPLL和PS VCCO。 VCCPINT为PS内…

【GoLang入门教程】Go语言几种标准库介绍(六)

文章目录 前言几种库Net库 (网络库,支持 Socket、HTTP、邮件、RPC、SMTP 等)重要的子包和功能:示例 OS库(操作系统平台不依赖平台操作封装)主要功能:示例 path库(兼容各操作系统的路径操作实用函数)常用函数&#xff1…

Elasticsearch 地理空间搜索 - 远超 OpenSearch

作者:来自 Elastic Nathan_Reese 2021 年,OpenSearch 和 OpenSearch Dashboards 开始作为 Elasticsearch 和 Kibana 的分支。 尽管 OpenSearch 和 OpenSearch Dashboards 具有相似的血统,但它们不提供相同的功能。 在分叉时,只能克…

【ArcGIS微课1000例】0087:经纬度格式转换(度分秒转度、度转度分秒)

ArcGIS软件可以很方便的直接实现度分秒转度、度转度分秒。 文章目录 一、转换预览二、工具介绍三、案例解析一、转换预览 借助ArcGIS快速实现度分秒与度及其他格式的坐标转换。例如:度分秒→度 度分秒: 度: 二、工具介绍 转换坐标记法:将一个或两个字段包含的坐标记法从一…

uniapp项目怎么删除顶部导航栏

uniapp去掉顶部导航的方法: 1、去掉所有导航栏 "globalStyle": { "navigationBarTextStyle": "white", "navigationBarTitleText": "uni-app", "navigationBarBackgroundColor": "#007AFF"…

Digital Audio (HDMI)未插入 用Hdmi连接电脑 显示高清数字音频未插入 win10电脑没声音,喇叭上一个叉❌

先说结论,出现这些问题的原因: 未插入音频设备或者硬件问题(10%)设置错误,未使用显示器音频 (30%)音频驱动不兼容或者没有驱动(50%)其他驱动有问题 (10%&…

OpenCV——多分辨率LBP的计算方法

目录 一、算法原理1、原理概述2、参考文献 二、代码实现三、结果展示 OpenCV——多分辨率LBP的计算方法由CSDN点云侠原创,爬虫自重。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫。 一、算法原理 1、原理概述 基本LBP算子虽然在早期…

TensorFlow相关组件的安装

安装Anaconda3 安装Anaconda3的时候可以安装在任意磁盘中,在勾选path的时候全部勾选即可。更换Anaconda3的下载源为清华大学源,在此期间不要打开Anaconda3,在cmd中依次输入以下即可: conda config --add channels https://mirro…

Vue3 子传父 暴露数据 defineExpose

defineExpose 属性:用于将子组件中的数据和方法,暴露给父组件,父组件再配合 ref 属性使用。 语法格式 // 子组件:暴露数据和方法 defineExpose({ 数据, 数据, 方法 });// 父组件:使用数据和方法 ref名称.value.数据 …

2024.1.11每日一题

LeetCode 2645.构造有效字符串的最少插入数 2645. 构造有效字符串的最少插入数 - 力扣(LeetCode) 题目描述 给你一个字符串 word ,你可以向其中任何位置插入 “a”、“b” 或 “c” 任意次,返回使 word 有效 需要插入的最少字…