Linux控制---进程程序替换

       前言:前面我们学洗了Linux进程退出的相关知识,了解了什么是进程退出,已经进程等待的相关话题,今天,我们来学习Linux中的进程程序替换,进程程序替换在Linux中可以用于实现新程序的启动、程序升级、多进程程序和程序恢复等多种应用。

目录

1、进程程序替换

什么是程序替换?

替换原理

单个进程的程序替换(无父子进程)

execl函数

程序替换原理详述

父子进程中的程序替换

替换进程如何得知要从程序的最开始开始执行?又如何得知最开始的地方在哪里?

替换程序覆盖性

exec函数分类

execlp、execv、execvp函数

程序替换只能替换系统程序?

C语言替换C++或python程序

多文件同时编译的自动化makefile实现

替换自己写的程序

c语言种替换shell脚本语言

环境变量与execle、execvpe函数

定义子进程自己的专属环境变量

execve系统调用


1、进程程序替换

什么是程序替换?

       在我们之前的讲解中,父子进程本质上都在使用同一份代码,这也就相当于父子进程在同一套代码之下完成任务,而我们创建子进程的目的本来就是为了能让子进程完成一些父进程需要其完成的任务,并带给父进程对应的返回结果,但是,如果父子进程在同一套代码逻辑中,那创建子进程不就相当于脱裤子放屁自找麻烦吗?其实,子进程被创建出来,是可以用来执行与父进程不同的程序的,程序替换简单来说就是将正在运行的程序替换为另一个程序。这个过程涉及内存加载新程序到内存中,并更新页表信息,初始化虚拟地址空间,然后将现有PCB的指针指向新的程序,使得现有PCB从头开始调度新的进程运行。需要注意的是,程序替换后,当前进程运行完替换后的程序就会退出,并不会回去运行原先的程序。

替换原理

       用fork创建子进程后执行的是和父进程相同的程序(但有可能执行不同的代码分支),子进程往往要调用一种exec函数以执行另一个程序。当进程调用一种exec函数时,该进程的用户空间代码和数据完全被新程序替换,从新程序的启动例程开始执行。调用exec并不创建新进程,所以调用exec前后该进程的id并未改变

单个进程的程序替换(无父子进程)

execl函数

      execl函数时exec函数中的一种,后面的几种我们稍后会提及,其功能替换一个指定路径的程序,

其中execl的参数,path参数就是替换程序所在的文件路径,arg就是执行命令的若干个参数,比如ls -a -l......,这些都属于这个参数,这里,我们先给出一个最简单的解释,比如我们需要执行“ls -a -l”,那么我们在命令行参数中就按这个顺序输入(“ls”,“-a”,“-l”)就可以了,也就相当于我们在命令行中如何使用,在参数中就如何输入即可,需要注意的是,该函数必须在参数最后加上NULL表示传入参数结束。具体如下面的用例:

我们发现一个现象,一旦我们进行了程序替换,也就是执行了execl函数,该函数之后的语句就不会再被执行了,上面的例子中,execl函数之后的printf函数没能够被执行,这一点就和我们程序替换的原理有关,下面我们就来对程序替换原理进行详细的分析,

程序替换原理详述

       在Linux中,进程程序替换通常指的是使用exec()系列函数来实现的进程替换过程。这个过程包括加载一个全新的程序(代码和数据)到调用进程的地址空间中,并开始执行新程序。这个过程会替换当前进程的内容,原有进程的执行状态和上下文信息会被丢弃。在进程替换发生时,原有进程的代码、数据和资源会被新的进程所取代。该替换过程没有创建新的进程,只是替换原来的进程

父子进程中的程序替换

       前面我们演示的是单进程的程序替换场景,如果在父子进程的模式下又会出现什么样的情况呢?我们知道,父子进程在不进行写操作时是共享同一份代码和数据的,但是如果父进程或者子进程发生了程序替换,那么此时剩下的那个进程就要采用我们之前学过的写时拷贝技术来将原有代码和数据拷贝一份供剩余进程使用,使得两个进程各自保持自己的独立性

替换进程如何得知要从程序的最开始开始执行?又如何得知最开始的地方在哪里?

       当我们采用程序替换的方式引入一个新的程序时,这个程序如何得知其该从哪个位置开始执行,又如何得知其执行的位置在哪里呢?实际上,每个可执行程序在磁盘中的存储,并不是单纯的只是存储代码和数据,可执行程序的二进制文件中,头部有一个专门的表结构,其中专门有一个字段用来表示程序的入口地址,通过将其填充到对应的调用进程的程序计数器pc中,即可达到调用的效果。这里顺便提一嘴,pc指针(eip)是cpu中的一个寄存器,在cpu中只有一个,但是并不是所有的进程只有一个pc指针,寄存器中的内容可以有多份,一个cpu可以有多套内容,分别用来对应不同的内容。

替换程序覆盖性

        我们在上面的代码中不难发现,不论是单个进程的程序替换,还是父子进程的程序替换,被替换的进程在执行exec函数结束后,其后续的代码均不会被执行,此时因为程序被替换,所以被替换程序会被覆盖,导致其后序的代码不会再被执行,这个就是替换程序的覆盖性。

exec函数分类

       前面我们了解到exec函数具有多种,但是各种函数之间的用法和功能却不尽相同,下面我们来介绍几种常见的exec函数:

execlp、execv、execvp函数

程序替换只能替换系统程序?

       上面我们的例子只是针对系统程序进行了替换,但是不代表程序替换只能局限于系统函数,事实上,程序替换还可以替换自己写的程序,这其中包括其他语言的程序(例如c++和python程序)还有shell脚本语言等,下面,我们就来演示一下。

C语言替换C++或python程序

首先,我们来分别编写一个C++和python文件:

多文件同时编译的自动化makefile实现

      当我们想要一次编译两个或两个以上的源文件并形成对应的目标文件时,我们就需要只调用一次makefile工具就能直接将所有源文件全部编译,但是我们知道makefile从上往下扫描的时候默认只形成扫描到的第一个目标文件,所以我们就需要采取一些手段,使其能够同时编译出两份目标文件,我们可以将两份目标文件封装成一个总的目标文件放在makefile首部,这样,默认调用的首个目标文件中就包含了我们需要的两个目标文件,从而达到目的。

比如,我们一次需要形成C和C++的可执行程序时,我们可以采用如下的方式编写makefile:

替换自己写的程序

python程序也是同理,python是一种解释型语言,Python 解释器在运行代码时不会将其编译为机器语言。相反,它会在运行时解释代码,所以,我们不能够在通过makfile编译形成目标文件来形成所谓的“python的可执行程序”了,我们只能通过调用python的解释器来直接解释我们的python文件,具体实现如下:

c语言种替换shell脚本语言

       脚本语言,或称为动态编程语言,是一种解释型语言。它通常用于执行具有复杂逻辑和流程控制的任务,比如网页编程、系统配置、游戏脚本等。其采用系统的bash命令行解释器就可以运行,比如我们可以编写和运行如下的shell脚本,至于如何编写这里先了解即可,这不是我们的重点:

此时,我们可以将其替换为在程序中运行,如下:

      现在,你可以拿着这个和你的朋友装一下了,我们可以在c上运行其他语言的代码,其实不仅是c语言,其他的编程语言都有着类似的程序替换函数,感兴趣的可以去百度一下。

环境变量与execle、execvpe函数

       环境变量一般是具有全局属性的,也就是说,它可以被进程和子进程之间共享,对于父子进程之间,环境变量共用一套无可厚非,并且,我们也知道,父进程的环境变量来源于bash命令行解释器,为了验证bash、父进程和子进程的爷、父、孙的关系,我们可以将父进程中子进程进程替换的代码修改为输出打印环境变量,接着我们利用export向命令行bash进程中加入一个新的临时环境,看其是否会被父进程和子进程所接受和显示,参考代码如下:

接着,我们在命令行导入一个临时环境变量到bash进程中去:

此时,该环境变量就被保存在了bash进程中,接着,我们编译并运行代码,然后,我们可以发现打印出的孙子进程的环境变量中存在我们创建的环境变量(也就是来自“爷爷”进程的环境变量)。

        事实上,父子进程在传递的过程中,子进程是默认继承父进程的去全部的环境变量的,并且不会受到程序替换的影响,前面已经提到,程序替换本质上并没有改变进程的pcb和进程地址空间等内核数据结构,只是替换了物理内存上的代码和数据而已,而环境变量则是随着进程地址空间上的一个字段上保存的,所以,子进程在创建的时候会继承父进程的进程地址空间,也就把父进程的环境变量给继承了下来。

定义子进程自己的专属环境变量

     如果我们的子进程想要定义属于自己的环境变量而不希望再沿用父进程的环境变量,就需要用到我们下面的两个函数了:

例如,此时我们想要修改子进程的被替换程序的环境变量,参考代码如下:

为了方便显示出我们传入命令行参数的效果,我们可以在替换程序中将命令行参数打印出来: 

运行代码,结果如下:

       可以看到,被替换程序的环境变量已经被覆盖式的修改成了我们自己定义的环境变量,注意是覆盖不是新增,那当我们需要新增时怎么办?还记得我们上面给bash添加环境变量时的场景吗?想要给子进程在原来的基础上新增环境变量,我们只需要在其父进程里创建一个临时环境变量就可以了,此时子进程将会继承父进程的环境变量表,包括新增的。

execve系统调用

       execve接口是在Unix和类Unix操作系统中执行新程序的系统调用。事实上,只有execve是真正的系统调用,其它六个函数最终都调用execve,所以execve在man手册 第2节,其它函数在man手册第3节。这些函数之间的关系如下图所示。

本篇到这里就结束了,下期,我们将自己动手做一个简单的shell,可以实现简易的指令反馈和操作,模拟在XShell上的各种指令,持续更新......

       真正能给你撑腰的是丰富的知识储备、足够的经济基础,持续稳定的情绪,可控的生活节奏,以后的日子里,希望你多长本事,多看世界,多走些路,把时间花在正事上,变成自己打心底里喜欢的人,世界上任何东西都应该是被吸引来的,而不是强求来的,梧高峰必至,花香蝶自来。

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

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

相关文章

11.10 知识总结(数据的增删改查、如何创建表关系、Django框架的请求生命周期流程图)

一、 数据的增删改查 1.1 用户列表的展示 把数据表中得用户数据都给查询出来展示在页面上 添加数据 id username password gender age action 修改 删除 1.2 修…

【数据库开发】DataX开发环境的安装部署(Python、Java)

文章目录 1、简介1.1 DataX简介1.2 DataX功能1.3 支持的数据通道 2、DataX安装配置2.1 DataX2.2 Java2.3 Python 3、DataX Web安装配置3.1 mysql3.2 DataX Web3.2.1 简介3.2.2 架构图3.2.3 依赖环境3.2.4 安装 4、入门使用4.1 DataX自带打印示例测试4.2 DataX生成任务模板文件4…

kubernetes集群编排——istio

官网:https://istio.io/latest/zh/about/service-mesh/ 部署 [rootk8s2 ~]# tar zxf istio-1.19.3-linux-amd64.tar.gz [rootk8s2 ~]# cd istio-1.19.3/[rootk8s2 istio-1.19.3]# export PATH$PWD/bin:$PATH demo专为测试准备的功能集合 [rootk8s2 istio-1.19.3]# i…

Linux文件系统之inode

文章目录 1. 磁盘1.1 认识磁盘1.2 磁盘物理构造1.3 磁盘逻辑结构 2. 文件系统3. 如何理解目录 1. 磁盘 1.1 认识磁盘 文件 内容 属性,而文件是存储在磁盘上,那么可以理解为磁盘上存储的文件 存储的文件内容 存储的文件属性。 文件的内容采用的是块式…

kube-bench-CIS基准的自动化扫描工具学习

仓库地址:GitHub - aquasecurity/kube-bench: Checks whether Kubernetes is deployed according to security best practices as defined in the CIS Kubernetes Benchmark kube-bench,检查 Kubernetes 是否根据 CIS Kubernetes 基准中定义的安全最佳实践部署,下载…

应用协议安全:Rsync-common 未授权访问.

应用协议安全:Rsync-common 未授权访问. Rsync 是 Linux 下一款数据备份工具,支持通过 rsync 协议、ssh 协议进行远程文件传输。其中 rsync 协议默认监听 873 端口,如果目标开启了 rsync 服务,并且没有配置 ACL 或访问密码&#…

Redis05-集群方案

目录 Redis集群方案 主从复制 主从复制的基本原理 主从复制的工作流程 乐观复制 主从复制的优势 哨兵机制 哨兵的关键作用 服务状态监控 哨兵选举Master规则 分片集群 分片集群中的数据读写 数据写入 数据读取 一致性哈希和客户端分片 Redis集群方案 微服务时代…

TDengine 与煤科院五大系统实现兼容性互认,助力煤矿智能化安全体系搭建

近日,涛思数据与煤炭科学技术研究院(以下简称煤科院)已完成数个产品兼容互认证工作,经双方共同严格测试,涛思数据旗下物联网、工业大数据平台 TDengine V3.X 与煤炭科学技术研究院旗下煤矿复合灾害监测监控预警系统、煤…

Elasticsearch docker-compose 使用 Logstash 从 JSON 文件中预加载数据

在我们创建 Elasticsearch 进行开发时,最简单的办法就是在本地使用 docker-compose 来一键部署一个 Elasticsearch 集群。有时,特别是在准备测试环境时,开发人员希望从一开始就创建包含一些测试数据的数据库容器。我们可以使用 Logstash 来很…

什么是自动化测试框架?

无论是在自动化测试实践,还是日常交流中,经常听到一个词:框架。之前学习自动化测试的过程中,一直对“框架”这个词知其然不知其所以然。 最近看了很多自动化相关的资料,加上自己的一些实践,算是对“框架”…

使用python电脑轻量级控制手机—adb命令和手机投屏

文章目录 一、通过无线连接手机和电脑二、使用adb命令轻量级控制手机二、使用scrcpy控制手机 通过电脑控制手机有多种方式如appnium等,本文介绍的是两种轻量级的方案,使用adb命令刚和手机投屏。 一、通过无线连接手机和电脑 1、手机设置 开发者选项—us…

使用 MATLAB HDL Coder 和 FPGA 快速实现自动白平衡(AWB)

使用 MATLAB HDL Coder 和 FPGA 快速实现自动白平衡(AWB) 在此项目中,我们将使用 MATLAB Simulink 和 HDL 编码器创建自定义 IP -- AWB。 MATLAB 设计 自动白平衡模块的设计是使用 HDL Coder 在 MATLAB 和 Simulink 中创建的。HDL Coder能够生…

11.15 知识总结(模板层、模型层)

一、 模板层 1.1 过滤器 1.什么是过滤器? 过滤器类似于python的内置函数,用来把变量值加以修饰后再显示。 2. 语法 1、 {{ 变量名|过滤器名 }} 2、链式调用:上一个过滤器的结果继续被下一个过滤器处理 {{ 变量名|过滤器1|过滤器2 }} 3、有的过…

idea中搭建Spring boot项目(借助Spring Initializer)

创建新项目 启动端口 在项目配置文件application.properties中写入 #启动端口server.port8088编写测试方法 创建控制类文件夹–>便于规范我们新建一个controller包–>建一个HelloWorld.class package com.example.hellospringboot.controller;import org.springframew…

Linux下MSSQL (SQL Server)数据库无法启动故障处理

有同事反馈一套CentOS7下的mssql server2017无法启动需要我帮忙看看,启动报错情况如下 检查日志并没有更新日志信息 乍一看mssql-server服务有问题,检查mssql也确实没有进程 既然服务有问题,那么我们用一种方式直接手工后台启动mssql引擎来…

arcgis--填充面域空洞

方法一:使用【编辑器】-【合并工具】进行填充。首选需要在相同图层中构造一个填充空洞的面域,然后利用【合并】工具进行最后填充。 打开一幅含有空洞的矢量数据,如下: 打开【开始编辑】-【构造工具】-【面】进行覆盖空洞的面域的…

时间序列预测实战(九)PyTorch实现LSTM-ARIMA融合移动平均进行长期预测

一、本文介绍 本文带来的是利用传统时间序列预测模型ARIMA(注意:ARIMA模型不属于机器学习)和利用PyTorch实现深度学习模型LSTM进行融合进行预测,主要思想是->先利用ARIMA先和移动平均结合处理数据的线性部分(例如趋势和季节性&#xff09…

[html] 动态炫彩渐变背景

废话不多说&#xff0c;直接上源码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>ZXW-NUDT: 动态炫…

如何在 macOS 中删除 Time Machine 本地快照

看到这个可用82GB&#xff08;458.3MB可清除&#xff09; 顿时感觉清爽&#xff0c;之前的还是可用82GB&#xff08;65GB可清除&#xff09;&#xff0c;安装个xcode都安装不上&#xff0c;费解半天&#xff0c;怎么都解决不了这个问题&#xff0c;就是买磁盘情理软件也解决不了…

Spring Boot 整合xxl-job实现分布式定时任务

xxl-job介绍 XXL-JOB是一个分布式任务调度平台&#xff0c;其核心设计目标是开发迅速、学习简单、轻量级、易扩展。现已开放源代码并接入多家公司线上产品线&#xff0c;开箱即用。 xxl是xxl-job的开发者大众点评的许雪里名称的拼音开头。 设计思想 将调度行为抽象形成“调度…