【进程控制⑥】:进程替换/exec*()系列接口

【进程控制⑥】:进程替换/ exec*()系列接口

  • 一.进程替换原理
  • 二.替换特点
    • 1.独立性
    • 2.唯一性
    • 3.不变性
    • 4.不返回
  • 三.程序替换应用
    • 【exec*系列系统调用】
    • ①execl:
    • ②execlp:
    • ③execv:
    • ④execle:

一.进程替换原理

我们的程序是可以将系统调用接口给封装起来,调用我们的程序本质就是调用了系统接口。
那么如何进行封装呢?通过exec*系列函数可以完成进程的程序替换,比如下面的是是比较标准的写法:

在这里插入图片描述
第一个参数是程序的路径,第二个参数就是程序名,而后面的参数就是可选择参数。
就比如这句代码将要把该进程替换成
/user/bin/ls路径下的程序名为ls的进程,并带上-a,-l选项。
然后当我们调用我们的程序时,就会调用到ls -a -l命令。

替换的原理是什么呢?

要知道可执行程序和文件都存储在磁盘中,而我们的程序的代码和数据则已经加载到内存中了。execl的方法非常暴力,直接替换。什么意思呢?就是直接将磁盘里的可执行程序(要替换的程序)的代码和数据替换现在进程的的代码和数据。替换完后,进程并没有被影响,该调用就调用,只不过物理内存里的地址发生改变了。虚拟地址并没有改变。

在这里插入图片描述

二.替换特点

替换的原理非常简单粗暴,那这样会不会出现问题呢?
上面的情况是单进程,如果是多进程如何进行程序替换呢?
多进程通常是让子进程进行程序替换,而父进程则等待子进程。
在这里插入图片描述

1.独立性

子进程在进行程序替换时,会不会影响父进程呢?为什么这样说呢?因为父子进程共用同一块代码和数据,当子进程被替换成新的可执行程序时,它的代码和数据也就被替换了,那父进程的代码和数据呢?

答案:当然不会!因为进程之间是具有独立性的---->[写时拷贝]
在子进程没有执行程序替换之前,与父进程共享代码和数据,当子进程执行程序替换时,需要将新的程序的代码和数据覆盖父进程的代码和数据,但不要慌!为什么呢?因为存在写时拷贝!
当往父进程的数据里写入时,就会发生写时拷贝,重新申请一块内存给子进程写入,所以父进程的数据并没有被覆盖掉。那代码呢?
代码有没有被覆盖掉呢?其实代码也存在写时拷贝,也没有被覆盖掉。
在这里插入图片描述

2.唯一性

程序替换有没有创建新的进程呢?

答案:并没有创建新的进程!只是进行进程的代码和数据的替换工作,并不会创建进程。原来的进程还是原来的PCB和进程地址空间和页表。只不过物理内存发生改变了,只需要改变一下页表的映射关系。
在这里插入图片描述

3.不变性

当子进程发生程序替换后,将会发现子进程的环境变量还是原来的环境变量,并没有被覆盖掉。我们知道子进程的环境变量是继承父进程的,那环境变量是什么给进程的呢?因为环境变量也是数据,创建子进程的时候,环境变量就已经被子进程继承下去了,当发生替换后,子进程的环境变量不变,说明程序替换是不会将环境变量替换的。

如果我们非要替换环境变量有没有方法呢?

当然有
①因为子进程是继承父进程的,所以我们只要修改父进程的环境变量就可以更新子进程的环境变量。
②或者使用带有e的exec*系列函数接口,这个是要自己传递环境变量,并且会覆盖原来的环境变量
在这里插入图片描述

4.不返回

还有就是进程程序替换成功后,就不会再返回,也就是exec*函数后面的代码就不会执行了,如果程序替换失败才会返回,后面的代码才会执行,所以这个就可以作为程序替换是否成功的判断条件,当替换失败了,就会执行子进程后面的代码,后面的代码肯定会有退出exit(),我们只要设置对应的退出码即可判断。

在这里插入图片描述

三.程序替换应用

程序替换的系统调用接口大概有7个,这里介绍经常使用的6个系统调用函数。
在这里插入图片描述

【exec*系列系统调用】

注意以上函数基本上第一个参数都是程序的路径,为什么要程序的路径呢?你要替换这个程序,也就是要执行这个程序,你执行这个程序不应该要先知道这个程序在哪吗?所以程序的路径是必须要有的。当找到这个程序之后呢?我们是不是就要思考,怎样执行这个程序呢?是以什么方式执行呢?而后面的参数就是用来传不同的参数使程序以想要的方式执行。[即命令行参数]

  • ①execl:

—>‘l’ 注意这个l是什么意思呢?我们可以看成list链表,为什么呢?因为它后面的参数可以像链表一样,一个一个链接起来,不是一个整体。而如何使用呢?命令行怎么写的,你就怎么传就可以了。在这里插入图片描述

  • ②execlp:

‘p’,注意这个p是什么意思呢?这个p可以理解为环境变量中的PATH。默认路径,你注意到没它的第一个参数不是路径而是程序文件名,这说明像这样的函数我们不需要传路径,系统会到默认路径PATH里去找,只需要写要执行的文件名即可。
在这里插入图片描述

  • ③execv:

‘v’,注意这个v是什么意思呢?这个v可以理解为vector数组,为什么这样说呢?因为它的后面的参数可以放进一个数组统一传过来。而不像list那样一个接着一个。
在这里插入图片描述
要注意理解:当我们调用exec*系列系统调用接口时,我们传的命令行参数,会被系统自动传给要替换的程序的main函数。要替换的程序的main会接收这些命令行参数的。

  • ④execle:

‘e’,注意这个e是什么意思呢?这个e其实是环境变量env。我们进行程序替换时,也可以传递环境变量给要替换的程序。
在这里插入图片描述

在这里插入图片描述

exec*接口不仅可以替换那些已经存在的可执行程序,还可以调用我们自己写的可执行程序,就比如用C去调用C++程序。为什么可以呢?因为一旦程序执行就会变成进程,而进程就可以被替换,就算是其他语言写的程序一旦变成进程也可以被替换调用。

在这里插入图片描述
我们可以用自己写的程序来替换子进程,这样就可以验证当一个程序被替换时,系统会自动将那些环境变量命令行参数都传给替换的程序的main函数。
在这里插入图片描述

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

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

相关文章

视频编码转换技巧:视频批量转码H264转H265,高效且顺畅

随着数字媒体的广泛应用,视频编码转换已成为一种普遍的需求。不同的视频格式和编码标准使得在不同设备上播放视频成为可能,同时也带来了兼容性和传输效率的问题。本文讲解引用云炫AI智剪使视频编码转换技巧,即批量将H264编码转换为H265编码&a…

厦门万宾科技智能井盖监测仪器的作用如何?

越来越多的人们希望改善生活,走出农村走出大山,前往城市之中居住。由此城市的人口和车辆在不断增加,与之而来的是城市的交通压力越来越大,时常会出现道路安全隐患,这给城市未来发展和智慧城市建设都带来一定的难题&…

sass相关

1、代码简化 1.1、简化媒介查询 mixin flex{display: flex;justify-content: center;align-items: center; } .header{width: 100%;include flex;//可以这样引用 }//加入参数 mixin flex($layout){display: flex;justify-content: $layout;align-items: $layout; } .header{w…

智慧矿山AI算法助力护帮板支护监测,提升安全与效率

在智慧矿山AI算法系列中,护帮板支护监测是保障矿山安全和提高生产效率的重要环节。护帮板作为矿山支护体系中的重要组成部分,在矿山生产中起到了关键的作用。那么,护帮板在哪种状态下是正常打开的呢?本文将对此进行介绍。 护帮板的…

Mgeo:multi-modalgeographic language model pre-training

文章目录 question5.1 Geographic Encoder5.1.1 Encoding5.1.2 5.2 multi-modal pre-training 7 conclusionGeo-Encoder: A Chunk-Argument Bi-Encoder Framework for Chinese Geographic Re-Rankingabs ERNIE-GeoL: A Geography-and-Language Pre-trained Model and its Appli…

QT6/5无痛安装和扩展,新手专用

QT6安装教程 注意在QT5.14.2以后版本只支持在线安装,所以如果需要离线exe版本,请安装5.14.2版本。这里是基于6.5版本Windows10的安装 如果觉得有用的话,请给个点赞收藏 1、安装链接 官方链接 qt官方链接:https://download.qt.io…

分类预测 | Matlab实现SMA-KELM黏菌优化算法优化核极限学习机分类预测

分类预测 | Matlab实现SMA-KELM黏菌优化算法优化核极限学习机分类预测 目录 分类预测 | Matlab实现SMA-KELM黏菌优化算法优化核极限学习机分类预测分类效果基本描述程序设计参考资料 分类效果 基本描述 1.MATLAB实现SMA-KELM黏菌优化算法优化核极限学习机分类预测(完整源码和数…

linux下df -h 命令一直卡住的解决方法

在Linux中,偶尔遇到用 df -h 查看磁盘情况时,一直卡住无法显示结果。 解决方法: 1、首先使用strace追踪到底执行到哪里卡住 $ strace df -h 2、如果没有strace命令则进行安装 $ yum install strace -y 3、显示出卡住的地方,如…

SaaS 出海,如何搭建国际化服务体系?(三)

防噎指南:这可能是你看到的干货含量最高的 SaaS 出海经验分享,请准备好水杯,放肆食用(XD。 当越来越多中国 SaaS 企业选择开启「国际化」副本,出海便俨然成为国内 SaaS 的新角斗场。 LigaAI 观察到,出海浪…

Linux | 如何保持 SSH 会话处于活动状态

在远程服务器管理和安全数据传输中,SSH(Secure Shell)是不可或缺的工具。然而,它的便利性和安全性有时会因常见的问题而受到损害:冻结 SSH 会话。 此外,session 的突然中断可能会导致工作丢失、项目延迟和无…

软件测试/测试开发丨利用ChatGPT自动生成架构图

点此获取更多相关资料 简介 架构图通过图形化的表达方式,用于呈现系统、软件的结构、组件、关系和交互方式。一个明确的架构图可以更好地辅助业务分析、技术架构分析的工作。架构图的设计是一个有难度的任务,设计者必须要对业务、相关技术栈都非常清晰…

锐捷RG-EW1200G登录绕过漏洞复现

文章目录 锐捷RG-EW1200G登录绕过漏洞复现0x01 前言0x02 漏洞描述0x03 影响版本0x04 漏洞环境0x05 漏洞复现1.访问漏洞环境2.复现 0x06 修复建议 锐捷RG-EW1200G登录绕过漏洞复现 0x01 前言 免责声明:请勿利用文章内的相关技术从事非法测试,由于传播、…

为什么开设项目管理专栏

首先,向各位同道同行,分享一个来自博主的好消息: 2023年8月,经过一次为期3个月的紧张、有序、活泼、生动的学习之旅,博主顺利通过了PMP认证,并且拿下3A。 其次,为记录本次学习过程的点滴和心得…

从零开始的目标检测和关键点检测(一):用labelme标注数据集

从零开始的目标检测和关键点检测(一):用labelme标注数据集 1、可视化标注结果2、划分数据集3、Lableme2COCO,将json文件转换为MS COCO格式 前言:前段时间用到了mmlab的mmdetction和mmpose,因此以一个小的数…

63. 不同路径 II

一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish”)。 现在考虑网格中有障碍物。那么从左上角到右下角…

重生奇迹mu下贫民玩家的崛起之路

任何一个网络游戏中都有两种玩家,一种为壕级玩家,一种则是贫民,这种区分并没有过份的含义,只是不同的游戏消费观念使然,尤其是贫民玩家反而还居多数!甚至你只要精通以下的种种技巧,贫民玩家也可…

【基于MRA:自适应高频融合和注入系数优化:Pansharpening】

Pansharpening Based on Adaptive High-Frequency Fusion and Injection Coefficients Optimization (基于自适应高频融合和注入系数优化的全色锐化) 全色锐化的目的是将多光谱(MS)图像与全色(PAN)图像融…

面向Three.js开发者的3D自动纹理化开发包

DreamTexture.js 是面向 three.js 开发者的 3D 模型纹理自动生成与设置开发包,可以为 webGL 应用增加 3D 模型的快速自动纹理化能力。 图一为原始模型, 图二图三为贴图后的模型。提示词: city, Realistic , cinematic , Front view ,Game scene graph 1、…

腾讯云双11活动时间、活动入口、优惠政策详细解读

2023年腾讯云双11大促活动已开启,作为年终最大的一次优惠促销活动,腾讯云的优惠力度还是不错的,爆款云服务器首年88元,还有9999元大额代金券免费领取! 一、腾讯云双11活动时间 即日起至2023-11-30 23:59:59&#xff0…

项目实战之安装依赖npm install

文章目录 nvmdeasync包和node-gyp报错deasync包node-gyp报错 前言:有些人看着还活着其实已经凉了好一会儿了。 初拿到项目 初拿到项目肯定是先看配置 package.json的啦,看看都需要安装什么依赖,然后 npm install,OK结束 皆大欢喜。 ————…