详解:进程程序替换

news2024/11/24 17:00:38

目录

    • 一、前言
    • 二、什么是进程程序替换?
    • 三、进程程序替换的原理
    • 四、为什么要进行进程程序替换?
    • 五、如何进行进程程序替换?(常见进程程序替换系统调用接口)
    • 六、利用所学综合知识实现一个shell
    • 总结

一、前言

一般情况下,对应的语言写的程序只能调用对应的语言的接口,而不能调用其他语言的接口,如C++不能调用Java或者Python或者Shell等语言的接口,那么如果我们想要调用别人写的程序应该怎么办呢?那么进程程序替换就能够很好地帮助我们解决这个问题,这在很大程度上减少了我们编程的成本,学会进程程序替换,在很多时候,如果有现成的程序,那么我们不需要自己再去写一个,是不是方便很多了?

二、什么是进程程序替换?

所谓进程程序替换,顾名思义,就是使用一个新的程序替换原有的程序,进程将执行新程序的代码,而不再执行原有程序的代码,前面我们已经学习了如何创建一个进程,一般情况下,进程程序替换都不会使用父进程直接进行进程程序替换,而是让父进程调用fork()函数创建一个子进程,让子进程去执行一个新的程序即可

三、进程程序替换的原理

  • 进程替换前的效果图
    当一个进程成功创建一个子进程之后,父子进程的情况如下图所示:
    在这里插入图片描述
    这个时候,我们这里先针对代码和数据进行分析,其他内容暂不做考虑,此时父子进程都没有修改代码和数据,因此,父子进程的代码和数据都是指向同一块内容的,也就是代码和数据共享的,如果其中一方对数据进行修改,则这一方就会进行写时拷贝,如果想要执行不同的代码,则此时就要进行进程程序替换
  • 进程程序替换的原理
    假如刚开始父子进程都是执行程序a.exe,后面,想要让子进程执行b.exe了,那么此时就要进行进程程序替换,替换的过程就是首先将b.exe从磁盘加载进内存,然后重新建立子进程的页表更新子进程的页表中的映射关系,注意,这里修改的是页表中的物理地址而不是虚拟地址,此时父子进程代码块中虚拟地址是一样的,但是通过页表映射出来的物理地址是不一样的,从而实现父子进程的代码彻底分离,此时父子进程的代码是互不干扰的,很好地满足了进程的独立性
  • 进程替换之后的效果图
    在这里插入图片描述

四、为什么要进行进程程序替换?

在学习进程程序替换之前,我们知道当一个父进程创建一个子进程之后,父子进程的代码是共享的,子进程只能执行父进程的代码块,但是现在我们的需求增加了,我们不仅要让子进程能够执行父进程的代码块,也要能够让子进程能够做一些父进程不能做的事情,也就是能够执行一个全新的代码(程序),这样就能实现父子进程做的事情有所差异,大大提高了办事效率,同时也使父子进程的代码彻底分离,维护进程的独立性

五、如何进行进程程序替换?(常见进程程序替换系统调用接口)

在学习使用进程程序替换的相关接口之前我们首先需要明确一点,这个在使用接口的时候需要做什么事情,很明显,最基本的我们首先得知道这个程序在哪里,其次,我们还需要知道怎么执行这个程序,在我们前面学习一些指令的时候,有些指令是可以携带选项的有些指令可以不用携带选项。总结起来就是我们需要知道要执行的程序的路径和怎么执行新程序

  1. execl
  • 查看execl的使用方法
    在这里插入图片描述
  • execl的使用
  • 源代码
    在这里插入图片描述
  • makefile文件
    在这里插入图片描述
  • 实验结果
    在这里插入图片描述
    上面的实验是没有子进程的,是一个纯单进程的实验,下面将演示一个多进程的例子执行ls指令,而且我们会发现一个现象,我们明明在源代码中写了两条printf函数语句,但是结果只有一条打印出来,原因是,当我们进行程序替换之后,子进程将不再执行原来的父进程的代码块,由进程程序替换的结果我们可以知道,子进程中的代码内容完全被替换成新程序的代码
  • execl多进程实验
    源代码
    在这里插入图片描述
    makefile文件
    在这里插入图片描述
    实验结果
    在这里插入图片描述
    实验分析
    上面的实验思路就是父进程创建一个子进程,然后本来子进程是要执行父进程的代码块和父进程进行代码共享的,但是我们在子进程中调用execl函数接口,因此,在子进程中会进行程序替换
  1. execv函数接口的使用
  • 查看手册
    在这里插入图片描述
    这个函数和上面介绍的execl是类似的,都需要做两件事,第一知道新程序的路径,第二知道怎么执行新程序(是否携带选项进行执行),但是这个函数和上面介绍的函数的区别就是这个函数的第二个参数是一个字符指针数组,上面哪个函数是一个一级字符指针,其实区别就在于,上面那个函数传参传的是字符串列表,这个函数传参传的是字符指针数组
    实验演示:
  • 源代码
    在这里插入图片描述
  • makefile文件
    在这里插入图片描述
  • 实验结果
    在这里插入图片描述
    需要注意的是
  • execv函数中使用的是字符指针数组,而不是传字符串列表
  • 数组中的字符串是常量字符串,也就是const char类型的,而这个字符指针数组中存放的又是char的,是支持修改的,因此这里需要将const char强转为char类型
    在这里插入图片描述
  1. execlp函数接口的使用
  • 查看手册
    在这里插入图片描述
  • execlp的使用(实验演示)
    源代码
    在这里插入图片描述
    makefile文件
    在这里插入图片描述
    实验结果
    在这里插入图片描述
    execlp中的p指的是环境变量中的PATH,指的是系统直接到环境变量PATH中去寻找对应程序,因此在传第一个参数的时候不需要带路径
    注意:
    在这里插入图片描述
    这个参数列表中有两个"ls",我们需要知道的是这两个ls的含义是不一样的,是不能省略的,第一个是告诉系统要执行哪个程序,好让系统知道去找谁,第二个是在函数的第二个参数之中的,也就是为了告诉系统怎么执行这个程序
  1. execvp的使用
  • 查看手册
    在这里插入图片描述
  • 实验演示使用方法
    源代码
    在这里插入图片描述
    makefile文件
    在这里插入图片描述
    实验结果
    在这里插入图片描述
  1. execle函数接口的使用
  • 查看手册
    在这里插入图片描述
  1. execle的使用
    源代码
    在这里插入图片描述
    makefile文件(形成多可执行程序)
    在这里插入图片描述
    导出自己的环境变量
    在这里插入图片描述

实验结果
在这里插入图片描述
注意:
在这里插入图片描述

上面的实验中,我们使用函数execle传入第三方变量environ,environ的作用是获取系统中的环境变量,上面这个代码的意思就是将这个变量environ传给test程序,那么如果想要在该程序中打印出自定义的环境变量,则需要将自定义环境变量加入系统环境变量,test程序才能获取,如果没有加入系统环境变量,则getenv()函数获取不到对应的环境变量则会返回空指针,那么就会导致printf函数打印空指针从而造成程序崩溃

六、利用所学综合知识实现一个shell

敬请期待

总结

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

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

相关文章

ELMO语言模型

ELMOELMO提出背景:解决一词多义问题。模型结构:双层双向的LSTM,字符卷积,第一层lstm表示更多的句法特征,第二层lstm表示更多的语义特征从ELMO开始以后学的语言模型都是预训练语言模型。预训练模型:1.预训练…

微机-------输入/输出接口(第六章)

目录 输入/输出接口概述输入/输出接口的功能CPU与输入/输出接口之间的信息⭐⭐输入/输出端口的编址方式统一编址独立编址输入/输出接口概述 CPU与外部设备进行信息交换时的困难: ①CPU和外设的速度差异非常大 ②CPU不能和外设直接通过引脚连接 注意: CPU和外设之间必须要设置…

5G LDPC polar 3GPP 定案过程

前言 看到中科大袁老师一段关于3GPP 组织 在 5G LDPC, polar 编解码定案过程,简单分享一下 一 简介 整个方案上百家公司整整争论了一年,最终定下来 其里碑阶段分3段如下: 二 主要争论点 当初主要有两大纠纷: 1: 数字信道 和控制…

基于thinkphp校园二手交易网站#毕业设计

随着社会的发展,社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 东方二手交易网站设计管理系统网站主要的功能模块包括首页、个人中心、卖家管理、买家信息管理、商品信息管理、订单信息管理、商品分类管理、系统管理…

基于51单片机电子微波炉控制系统(源程序+仿真+原理图+全套资料)

资料编号:203 功能介绍: 该电子微波炉采用51单片机制作,有基本的加热、冷却、启动、停止等功能,并通过MCU 控制其加热、冷却时间,LED 数码管显示时间。程序采用C语言编写,仿真使用Proteus,程序…

Redis的分布式锁问题(十)最强分布式锁工具:Redisson

Redisson的引入 我们先来看看之前的基于setnx实现的分布式锁存在的问题: 我们之前实现的分布式锁是基于redis的setnx命令的特性的! 但是,这样子实现起来会有很多弊端! 不可重入 简单的来说就是一旦setnx [key] [value]后&…

这才是图扑数字孪生污水处理厂该有的样子

近年来,智慧水务、数字水务成为水务行业的热点领域。对于污水处理领域,如何贯彻落实双碳战略,积极推进智慧水厂建设,显得尤为关键。 图扑软件依托自主研发的 HT for Web 产品,并结合视频融合、BIM、5G、物联网、云计算…

matplotlib 中子图subplot 绘图时标题重叠解决办法

引言 使用Python的matplotlib库绘制子图发现标题发生了重叠。 原来的代码: plt.rcParams[font.family][SimHei] datayear_genfor i in range(1,11):plt.subplot(5,2,i)typetype_df.index[:][i-1]setplot_TypeTime(i,data,type)plt.show()上网上寻找解决办法。 按照…

Allegro添加渐近线操作指导

Allegro添加渐近线操作指导 Allegro支持添加渐近线,让线宽变化的地方进行圆环的过渡,对于射频信号优化有很大帮助,类似下图 具体操作如下 首先设置参数,route-Gloss-Parameters 点击Fillet and Taper Trace前面的方框 勾选Allowed DRC, Unused Nets 勾选Tapered Trac…

BLUElegend传奇引擎不使用路由器架设单传奇的办法

使用BLUE LEGEND架设传奇私发服单机的朋友,是不是因为找不到路由器而无法架设单机服务端呢,这里介绍一种方法不需要买路由器来架设。 为什么LEG引擎需要路由器才能架设呢? 网上找了很多教程都得不到答案,有些人说是为了固定ip地址…

[附源码]计算机毕业设计SpringBoot网上鲜花购物系统

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

leetcode-每日一题-1779-找到最近的有相同 X 或 Y 坐标的点(简单,数学思想)

今天这道每日一题很简单,没啥可说的,细心点即可 1779. 找到最近的有相同 X 或 Y 坐标的点 难度简单73收藏分享切换为英文接收动态反馈 给你两个整数 x 和 y ,表示你在一个笛卡尔坐标系下的 (x, y) 处。同时,在同一个坐标系下给你一…

基于verdaccio工具搭建npm私服vue组件库

大纲 搭建npm私服的必要性搭建npm私服操作步骤发布私有包的过程 一、搭建npm私服的必要性 下载速度更快便于管理,可以分配权限可以修改第三方包,放入我们得私服可以只在公司局域网中用,不公开 二、搭建npm私服的主要操作 环境准备 确保服…

Google单元测试框架gtest之官方sample笔记4--事件监控之内存泄漏测试

sample 10 使用event listener监控Water类的创建和销毁。在Water类中,有一个静态变量allocated,创建一次值加一,销毁一次值减一。为了实现这个功能,重载了new和delete关键字,然后在new和delete函数中,做all…

Sqoop概述 第1关:Sqoop概述

为了完成本关任务,你需要掌握: 1.Sqoop 概述; 2.Sqoop 基本架构。 Sqoop 概述 设计动机 Sqoop 从工程角度,解决了关系型数据库与 Hadoop 之间的数据传输问题,它构建了两者之间的“桥梁”,使得数据迁移工…

【Linux】ls命令

ls:List Directory Contents,显示目录下内容。 .表示当前目录 …表示上一级目录 .开头文件为隐藏文件 说明: 查看文件大小 ls -asSh ls -al ls -alh fan

门面/外观模式

一、门面模式 1、定义 门面模式(Facade Pattern)又称作外观模式,是指提供一个统一的接口,用来访问子系统中的一群接口,属于结构型设计模式。 门面模式的主要特征是定义了一个高层接口,让子系统更容易使用。…

PHP基于thinkphp的网上图书管理系统#毕业设计

本论文主要论述了如何使用php语言开发一个网上图书管理系统,本系统将严格按照软件开发流程进行各个阶段的工作,面向对象编程思想进行项目开发。在引言中,将论述网上图书管理系统的当前背景以及系统开发的目的,后续章节将严格按照软…

基于PHP+MySQL协同办公系统的设计与实现

随着全球经济一体化进程的加快和信息技术的飞速发展,Internet技术及其应用给人们的日常生活和工作等各个方面带来了深刻的影响。网络应用技术的不断提高,企业对于相互之间的通讯能力提出了更高的要求。许多企业都具有一定信息化基础,有一定数…

HTML文本溢出处理

有时在做某些需求布局时,需要处理文本溢出时的情况,如果不处理可能会重新重叠的效果,关于设置文本溢出,主要就是多行/单行的处理,代码如下 1.处理单行文本溢出 /* 设置文本溢出时的处理模式 */text-overflow:ellipsis;overflow: hidden;white-space: nowrap; 2.处理多行文本溢出…