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.mzph.cn/news/612483.shtml

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

相关文章

一文详解向量数据库Milvus Cloud动态 Schema

在数据库中,Schema 常有,而动态 Schema 不常有。 例如,SQL 数据库有预定义的 Schema,但这些 Schema 通常都不能修改,用户只有在创建时才能定义 Schema。Schema 的作用是告诉数据库使用者所希望的表结构,确…

如何利用 NFTScan Portfolio 功能分析钱包 NFT 持仓

随着 NFT 市场的扩大和投资者的增加,追踪和管理大量 NFT 资产正变得越来越复杂,无论是新手还是资深投资者,都需要借助实时的 NFT 数据作为判断依据。因此,一个能够全面分析 NFT 钱包持仓的工具就显得尤为重要。帮助投资者掌握自身…

bootstrap搭建一个简单的官网案例附代码

bootstrap搭建一个简单的官网案例附代码 效果常用属性完整代码 效果 大概的效果如下 主要都是用bootstrap的代码实现的 网站是照着 b站视频做的 查看视频教程 建议自己先看一遍文档再跟着视频写,不然可能看不懂 bootstarp中文文档 logo是从别人的站上扒的有点不太协…

阿里巴巴提出AnyText:首个解决多语言视觉文本生成的工作

基于扩散模型的文本到图像在最近取得了令人瞩目的成就。尽管当前的图像合成技术已经非常先进,能够以高保真度生成图像,但当关注生成图像中的文本区域时,往往可能会暴露问题,因为合成文本通常包含模糊、不可读或不正确的字符&#…

firewalld高级配置

IP伪装与端口转发 在互联网发展初期,设计者们并没有想到互联网会发展到现在这个空前繁荣的阶段,所以,设 计的Pv4地址空间只有32位.但是随着互联网的发展,P地址变得严重缺乏,并且地址分配不均匀, 所以就在原…

设计模式-规格模式

设计模式专栏 模式介绍模式特点应用场景规格模式和策略模式的区别和联系代码示例Java实现规格模式Python实现规格模式 规格模式在spring中的应用 模式介绍 规格模式(Specification Pattern)是一种行为设计模式,其目的是将业务规则封装成可重…

AIGC实战——改进循环神经网络

AIGC实战——改进循环神经网络 0. 前言1. 堆叠循环网络2. 门控制循环单元3. 双向单元相关链接 0. 前言 我们已经学习了如何训练长短期记忆网络 (Long Short-Term Memory Network, LSTM) 模型,以学习使用给定风格生成文本,接下来,我们将学习如…

OceanBase原生分布式数据库

1.历史背景 在Java Web项目中,常常使用免费开源的MySQL数据库存储业务数据,按业界经验MySQL单库超过多大数据体量,或单表超过几百万条数据后就会出现查询变慢的情况,单实例数据库只能扩展物理资源(CPU、内存),来提升查…

vivado 工程管理

管理项目 打开项目 当项目打开时,Vivado IDE会从项目已关闭。项目状态包括当前源文件顺序、已禁用和已启用 源文件、活动约束文件和目标约束文件,以及合成、模拟和实现运行。要打开项目,请使用以下方法之一: •在“入门”页面…

麦芯(MachCore)开发教程1 --- 设备软件中间件

黄国强 2024/1/10 acloud163.com 对任何公司来说,在短时间内开发一款高质量设备专用软件,是一件不太容易做到的事情。麦芯是笔者发明的一款设备软件中间件产品。麦芯致力于给设备厂商提供一个开发工具和平台,让客户快速高效的开发自己的设备专…

异构图 神经网络xFraud :Explaniable Fraud transcation detection

适用于异构图 2. 使用图进行异常检测 https://github.com/safe-graph/graph-fraud-detection-papers

Android 通知简介

Android 通知简介 1. 基本通知 图1: 基本通知详情 小图标 : 必须提供,通过 setSmallIcon( ) 进行设置.应用名称 : 由系统提供.时间戳 : 由系统提供,也可隐藏时间.大图标(可选) : 可选内容(通常仅用于联系人照片,请勿将其用于应用图标),通过setLargeIcon( ) 进行设置.标题 : 可选…

【LeetCode每日一题】2645. 构造有效字符串的最少插入数(计算组数+动态规划+考虑相邻字母)

2024-1-11 文章目录 [2645. 构造有效字符串的最少插入数](https://leetcode.cn/problems/minimum-additions-to-make-valid-string/)方法一:计算组数方法二:动态规划方法三: 考虑相邻字母 2645. 构造有效字符串的最少插入数 方法一:计算组数 …

uniapp中实现H5录音和上传、实时语音识别(兼容App小程序)和波形可视化

文章目录 Recorder-UniCore插件特性集成到项目中调用录音上传录音ASR语音识别 在uniapp中使用Recorder-UniCore插件可以实现跨平台录音功能,uniapp自带的recorderManager接口不支持H5、录音格式和实时回调onFrameRecorded兼容性不好,用Recorder插件可避免…

Leetcode 416 分割等和子集

题意理解: 给你一个 只包含正整数 的 非空 数组 nums 。请你判断是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。 即将数组的元素分成两组,每组数值sum(nums)/2 若能分成这样的两组,则返回true,否则返回false 本质上…

RobotStudio机器人码垛课程设计

一、任务需求 1、创建动态夹具(600*400*50) 2、创建物料(600*400*200) 3、起码按顺序码垛放置 4 个不同位置 二、软件常用操作及其快捷键 (推荐自己按这些步骤操作一下,能明白这些操作的具体意义&#…

Java版直播商城:电商源码、小程序、三级分销及 免 费 搭 建 方案

一、技术选型 java开发语言:java是一种跨平台的编程语言,适用于大型企业级应用开发。使用java开发直播商城可以保证系统的稳定性和可扩展性。 spring boot框架:spring boot是一个快速构建spring应用的框架,简化了开发过程&#xf…

[渗透测试学习] Clicker - HackTheBox

文章目录 信息搜集代码审计反弹shell提权 信息搜集 nmap扫描一下端口 nmap -sV -sC -v -p- --min-rate 1000 10.10.11.232扫描结果 22/tcp open ssh 80/tcp open http Apache httpd 2.4.52 ((Ubuntu)) //重定向 111/tcp open rpcbind 2-4 (RPC #100000)我们往…

如何查看Ubuntu内存的使用情况

在Linux系统中,了解内存使用情况对于系统管理和性能优化非常重要。以下是一些常用的命令,以及它们的详细使用说明: 1. free 命令 用途: free 命令用于显示系统中空闲和已用的物理内存及交换内存。示例: 输入命令: free -m输出解释: 这将以M…

python 爬虫 request get或post传参

爬虫传参 import requestsurl http://www.xxx# get 或 post 传参数据 data {"pageNo": 1652,"pageSize": 10, }headers {Cookie: ,Host: ,Origin: ,Referer: ,User-Agent: , }# get 请求 # res requests.get( # url, # paramsdata, # hea…