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

news2024/11/24 5:27:08

【进程控制⑥】:进程替换/ 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.coloradmin.cn/o/1163248.html

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

相关文章

【自动控制原理】数学模型:控制系统的运动微分方程、拉氏变换和反变换、传递函数

文章目录 第2章 数学模型基本概念2.1 控制系统的运动微分方程a. 常微分方程的一般标准形式b. 线性定常系统微分方程的一般标准形式 2.1.1 建立数学模型的一般步骤2.1.2 控制系统微分方程的列写 2.2 拉氏变换和反变换2.2.1 拉氏变换的定义2.2.2 典型函数的拉氏变换2.2.3 拉氏变换…

2023年鸿雁全国经销商大会暨秋季新品发布会圆满落幕

聚力同行,再起征程。11月2日,一场以“数字双翼,鸿雁奋飞”为主题的鸿雁全国经销商大会暨秋季新品布会在杭州盛大召开。鸿雁电器总裁王米成、副总裁吴明、副总裁夏晓衍、市场部总经理梁彩雷、灯饰与智能家居渠道部总经理王育炳、五金水暖渠道部…

照亮室外生活:户外灯具的创新趋势

日落之后,庭院变成了一个独特的世界,等待我们探索和享受。然而,要让庭院成为温馨、迷人的地方,户外照明起着关键作用。在这里,我们将讨论如何通过巧妙的户外照明,为庭院带来夜晚的魅力。 户外照明不仅是为了…

石油开采vr模拟生产安全体验平台提高员工上岗技能

近年以来我国矿山曾发生多起罐笼坠落事故,造成多人死伤,给企业和社会造成不良影响,事故的发生的主要原因多是人员违章、安全设施附件检修维护不到位。 钻井平台安全生产重于泰山,关乎经济社会发展大局,更关乎人们群众生…

StoneDB-8.0-V2.1.0 企业版正式发布!免费公测中!

很高兴告诉大家,我们StoneDB-8.0-V2.1.0企业版正式发布了!经过一个月的开发,我们的研发团队用极高的效率对2.0新架构版本查漏补缺,完善了最新架构的代码,并对性能、稳定性做出了优化,同时也修复了一些用户们…

OmniGraffle Pro 7.22.2(思维导图工具)

OmniGraffle Pro是一款图表绘制和设计软件,它的主要特点包括: 功能强大:OmniGraffle Pro提供了丰富的图形设计工具,包括各种形状库、图层支持、自定义模板等,可以满足用户在图表绘制和设计方面的各种需求。智能连接和…

《Linux从练气到飞升》No.25 Linux中多线程概念

🕺作者: 主页 我的专栏C语言从0到1探秘C数据结构从0到1探秘Linux菜鸟刷题集 😘欢迎关注:👍点赞🙌收藏✍️留言 🏇码字不易,你的👍点赞🙌收藏❤️关注对我真的…

WIN11如何固定文件夹查看方式

找一个文件夹,设置成自己需要的视图方式 文件夹选项>查看>应用到文件夹 缺点:所有相同类型文件夹都会使用此视图

什么是IPA,和RPA有啥区别和联系?

∵ IPA中包含了RPA的“PA”,AI的“I” ∴IPARPAAI,等式成立! AI:或人工智能,是一种复杂的计算机技术,旨在模仿人类智能行为和决策的能力。它涵盖了多种技术和方法,包括:机器学习&am…

脑洞大开、超级新奇小说,情节绝对出乎你的意料,不能错过

今天小郑要向大家推荐三本令人眼前一亮的小说,这些作品不仅脑洞大开,而且文笔也绝对一流,绝对不容错过! 《明尊》 但是,这部小说也有一些缺点。尤其是在不同副本之间质量起伏不定,有时候作者为了突出主角…

9.Vue前端使用iframe集成帆软报表的单点登录

一、背景 需要把帆软报表内嵌到若依里面来。 二、帆软设置 2.1 帆软报表的url 打开帆软后端里面的【目录管理】查看具体报表的url 帆软报表的具体地址为: Frm聚合报表地址: 【帆软的服务http】+【/webroot/decision/view/form?viewlet=demo/demo.frm】 CPT普通报表的地…

什么是配电室电能监测系统?

为了保证电力系统的安全、稳定、经济运行成为了当务之急。配电室电能监测系统作为一种新兴技术,有效提高了配电室的运行管理水平,降低了电力系统的风险。接下来,小编来为大家介绍下配电室电能监测系统,一起来看下吧! 一…

Python 框架学习 Django篇 (八) 代码优化、数据库冗余处理

我们开发软件系统的时候,需要不断的反思我们代码里面是否有可以优化的地方。而优化的重点之一,就是把冗余的代码优化为可以复用的库。我们在前面编写了一些功能,但是其中存在很多冗余的方法 mgr/medicine.py mgr/k8s.py mgr/medicine.py 打开…

postman连接mysql报ETIMEDOUT错误解决方法

问题 在cmd中执行xmysql -h localhost -u username -p password -d database命令后,报errorno: ETIMEDOUT’超时错误; 解决方法 给执行命令加上端口信息 -o post: xmysql -h localhost -u username -p password -d database -o port

企业采用生成式人工智能需要考虑什么

添加图片注释,不超过 140 字(可选) 添加图片注释,不超过 140 字(可选) 最近,各行业采用人工智能生成内容(AIGC)的趋势显着。这种变革性技术的一些著名实施包括Notion AI…

分别使用Java和C语言实现猜数字游戏(数字随机生成)

目录 一、Java实现 1.内容介绍 2.思路 3.完整代码 二、C语言实现 1.思路 2.完整代码 三、总结 1.产生随机数 2.分支结构 一、Java实现 1.内容介绍 (1)在程序运行起来之后,就提醒我们输入数字,猜的数字控制在[0-100]&a…

从用户角度出发,探索低代码服务商选择本地部署模式的内在逻辑

随着越来越多的企业开始关注本地部署模式,很多低代码服务商也将视角转向了本地部署模式。毕竟只有将各种软件和程序部署在本地,才能够更好地保护企业的数据安全。但是,选择恰当的本地部署模式,对于服务商来说是一个非常复杂的过程…

8.OsgEarth 鼠标位置及LabelControl中文显示

愿你出走半生,归来仍是少年! 在人机交互中,最常用的就是鼠标。获取鼠标在三维场景中的空间位置是保证交互结果正确的保障。 1.LabelControl 文本标签控件,可方便的添加在场景顶层。 设置编码及字体可正确的显示出中文。 setFont(osgText::re…

android studio app红叉无法编译

1.起源 今天前台小姐姐穿了一个白色的超短裙,和小姐姐聊了聊人生梦想,聊生活趣事,回到工位你马....报了一个这错误,无法运行了,明天就要打包测试了,顿时菊花一紧,急了一头汗,这你马咋回事,看了旁边的产品肥仔,迷着小眼露出了银建的笑容.开始排雷.... 意思就是说gradle初始化失…

如何使用 NFTScan NFT API 在 BNB Chain 网络上开发 Web3 应用

BNB Chain 是一条以太坊虚拟机兼容的区块链,是加密资产行业顶尖项目的测试和前沿探索。通过引入权益权威证明(PoSA)共识机制,BNB Chain 创建了验证一个允许节点、代币持有者、开发者和用户都能够从区块链中获益的生态系统&#xf…