【进程控制⑥】:进程替换/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…

js深度学习(一)

浏览器及内核 五大主流浏览器内核IEtridentchromewebkit blinksafariwebkitfirefoxgeckooperapresto 2、浏览器的历史和js的诞生 1990年 允许别人浏览他人编写的网站 1993年 图形化浏览器 1994年 网景 netspace navigator 1996年 微软的公司收购了spy glass -> IE inte…

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

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

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

linux 3.13版本nvme驱动阅读记录一

内核版本较低的nvme驱动代码不多,而且使用的是单队列的架构,阅读起来会轻松一点。 这个版本涉及到的nvme驱动源码文件一共就4个,两个nvme.h文件,分别在include/linux ,include/uapi/linux目录下,nvme-core.c是主要源码…

第四部分:jQuery

一:jQuery 1.1:jQuery介绍 什么是jQuery? jQuery是JavaScript和查询(Query),它是辅助JavaScript开发的js类库 jQuery的核心思想 核心思想是write less,do more,所以它实现了很多浏览…

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黏菌优化算法优化核极限学习机分类预测(完整源码和数…

二叉树系列主题Code

Python实现二叉树遍历 # 定义二叉树节点类 class TreeNode: def __init__(self, val0, leftNone, rightNone): self.val val self.left left self.right right # 前序遍历(非递归) def preorderTraversal(root): if not root: return [] …

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

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

Python操作PDF:PDF文件合并与PDF页面重排

处理大量的 PDF 文档是非常麻烦的事情,频繁地打开关闭文件会严重影响工作效率。对于一大堆内容相关的 PDF 文件,我们在处理时可以将这些 PDF 文件合并起来,作为单一文件处理,从而提高处理效率。同时,我们也可以选取不同…

Python的web自动化学习(四)Selenium的显性等待(元素定位)

引言&#xff1a; Selenium的显性等待&#xff0c;其常用的定位方法介绍&#xff0c;后面持续更细具体用法 示例如下&#xff1a; <input type"text" class"s_ipt" name"wd" id"kw" maxlength"100" autocomplete"…

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

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

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

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

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

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

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

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

为什么开设项目管理专栏

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