【Linux】进程(9):进程控制3(进程程序替换)

大家好,我是苏貝,本篇博客带大家了解Linux进程(9)进程控制1,如果你觉得我写的还不错的话,可以给我一个赞👍吗,感谢❤️
在这里插入图片描述


目录

  • (A)什么是进程程序替换
  • (B)原理
  • (C)父子进程中子进程程序替换原理
  • (D)使用所有的替换方法exec*,并且认识函数参数的含义
    • 1. execl
    • 2. execv
    • 3. execvp
    • 4. execlp
    • 5. 替换自己写的程序
    • 6. execvpe

(A)什么是进程程序替换

先直接看代码和现象,execl函数先不用管,后面会说到
在这里插入图片描述
在这里插入图片描述

通过结果我们发现,进程在执行完第一个printf函数后,执行的是ls -a -l的命令,而且不再执行第二个printf函数。所以,我们可以看出,execl函数的作用是让进程通过execl函数,执行新的程序。还是不理解,现在让我们来了解进程程序替换的原理

(B)原理

在这里插入图片描述

我们自己的代码编译后生成可执行程序,运行程序就变成了进程,此时操作系统就要为进程创建pcb、地址空间、页表,建立各种映射关系。运行程序testexec时,要将对应的代码和数据加载到内存中。

现在执行execl函数,我们知道,进程=内核数据结构+代码和数据,execl函数做的就是将本进程的代码和数据用新进程的代码和数据覆盖,进程的内核数据结构大体不变,只有少部分属性会发生改变。
在这里插入图片描述

站在替换进程的角度,就是这个进程被加载到内存中了

execl函数有没有创建新的进程?
没有,它只是用老进程的壳子执行新进程的代码

回到上面的例子,为什么没有打印第二个printf函数?
因为execl函数将本进程的代码和数据用新进程的代码和数据覆盖了

我们来看一下execl函数,我们上面的代码里面有后面的参数,但是没有用变量接收execl函数的返回值,那返回值重要吗?
不重要,我们可以不关心。只要替换成功,原来的代码就被覆盖了,所以我们不会再执行原先代码。但如果替换失败,我们还是会执行原先代码。

在这里插入图片描述

(C)父子进程中子进程程序替换原理

创建子进程,子进程可完成2种任务:

  1. 子进程执行父进程代码的一部分(即执行fork之后父子进程共享的代码)
  2. 子进程执行一个全新的程序(使用进程程序替换)

下面来讲父子进程中子进程程序替换的原理

在创建子进程后,父子进程页表映射的是同一块数据和代码空间
在这里插入图片描述

子进程要进程程序替换,对于数据a,因为进程程序替换是需要将进程的代码和数据用新进程的代码和数据覆盖,所以相当于要对数据进行写入,为了保证进程的独立性,会发生写时拷贝,即在物理内存中开辟一块新的空间,将数据a拷贝到该空间,再对该空间的数据进行写入(用新进程的数据覆盖),子进程的页表映射到该空间

那代码呢?我们之前讲的都是父子进程的代码共享,那现在呢?
因为子进程的代码也会被替换,所以也会发生写时拷贝

在这里插入图片描述

现在来用代码试一试
在这里插入图片描述

子进程执行的确实是ls -a -l命令,我们上面说过,只要替换成功,原来的代码就被覆盖了,所以我们不会再执行exit函数,所以退出码是0。
在这里插入图片描述

现在我们让进程程序替换失败,只修改了框框里的内容
在这里插入图片描述

替换失败,我们还是会执行原先代码exit(2),所以退出码是2
在这里插入图片描述

(D)使用所有的替换方法exec*,并且认识函数参数的含义

一共有6种替换方法,下面来逐一介绍
在这里插入图片描述

1. execl

exec后面的l:列表
在这里插入图片描述

第一个参数path:我们要执行的程序的路径(怎么找到程序,你得告诉我)
后面的参数:在命令行中怎么执行,就怎么传参
最后的参数:一定是NULL

举例:修改.c文件,如果我们想执行ls -l,先传ls的路径/usr/bin/ls,再传我们想怎么执行:在命令行中是ls -l,变成execl函数的参数时,就直接填上去就是了,不过它们要分成2个参数。如果我们想执行的是ls -a -l,那么就要分成3个参数(”ls”,”-a”和”-l”)

在这里插入图片描述
在这里插入图片描述

2. execv

v:表示数组
在这里插入图片描述

第一个参数和execl函数一样,都是要执行的程序的路径(怎么找到程序,你得告诉我)
第二个参数是个char* const类型的数组,只需要将execl除第一个参数以外的所有参数(包括NULL)放入一个数组中,再传这个数组即可

在这里插入图片描述

在这里插入图片描述

3. execvp

v:需要数组
p:查找这个程序,系统会自动在环境变量PATH中进行查找。所以用户可以不传要执行的程序的路径(但是程序名要传),直接告诉exec*函数,我要执行谁就行

在这里插入图片描述

在这里插入图片描述

4. execlp

l:list,列表
p:查找这个程序,系统会自动在环境变量PATH中进行查找。所以用户可以不传要执行的程序的路径(但是程序名要传),直接告诉exec*函数,我要执行谁就行
在这里插入图片描述

虽然有2个“top”,但它们的含义不同。第一个表示我要执行的程序的程序名,第二个是我要怎么执行该程序

5. 替换自己写的程序

我们上面替换的都是系统命令,可不可以替换我们自己写的程序呢?当然可以

先写要替换的我们自己写的程序的.c文件

在这里插入图片描述

修改要被替换的.c文件
在这里插入图片描述

execl函数的第一个参数传./myprocess我能理解,就是传要执行的程序的路径。那第二个参数不是说命令行中怎么传,我们就怎么传吗?为什么不是和命令行一样,传./myprocess,而是直接传myprocess?因为我们已经知道了myprocess的路径,命令行中传./myprocess是因为我们不知道myprocess的路径

只用make将2个.c文件都编译形成可执行程序

在这里插入图片描述
在这里插入图片描述

替换成功

在这里插入图片描述

6. execvpe

v:数组
p:查找这个程序,系统会自动在环境变量PATH中进行查找。所以用户可以不传要执行的程序的路径(但是程序名要传),直接告诉exec*函数,我要执行谁就行
e:环境变量

在这里插入图片描述

修改被替换进程对应的.c文件
在这里插入图片描述

第一个参数按标准来是只需要输入程序名,系统会自动在环境变量PATH中进行查找。但是因为myprocess程序不在PATH内容的路径中,所以只能./myprocess。 第2和第3个参数表示我们将它们传给myprocess程序

修改要替换的我们自己写的程序的.c文件。程序接收到了execvpe函数传递的命令行参数(argv数组)和环境变量(envp数组),现在我们将这两个数组打印出来
在这里插入图片描述
在这里插入图片描述

了解了execvpe函数之后,我们就可以知道,之前我们说环境变量的时候说bash会将命令行参数表和环境变量的表交给子进程,怎么交呢?就是bash用execvpe函数,将命令行参数表和环境变量表分别作为第二个和第三个参数 传给子进程。子进程将这2张表传给它的子进程同理。

对于execvpe函数的第三个参数的作用:整体替换所有的环境变量。所以传参时有3种选择:

  1. 用自定义环境变量传参
  2. 用默认的环境变量传参
  3. 默认的环境变量稍微修改,再传参

介绍第二种,用默认的环境变量传参
需要用到environ

在这里插入图片描述
在这里插入图片描述

介绍第三种,默认的环境变量稍微修改,再传参

需要用到putenv函数:修改或添加一个环境变量,其实就是将修改写入环境变量表或写入一个新的变量到环境变量表中

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述


好了,那么本篇博客就到此结束了,如果你觉得本篇博客对你有些帮助,可以给个大大的赞👍吗,感谢看到这里,我们下篇博客见❤️

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

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

相关文章

『ComfyUI』从小白到入门全套教程,奶奶看了都会了!赶紧收藏!

本文简介 Stable Diffusion WebUI 应该是大多数人第一次接触 SD 绘画的工具,这款工具简单易上手,但操作流程相对固定。如果你想拥有更自由的工作流,可以试试 ComfyUI。而且很多新的模型和功能在刚出现时 ComfyUI 的支持度都比较高&#xff0…

【UE5】调用ASR接口,录制系统输出。录制音频采样率不匹配

暂时测出window能用。阿里的ASR接口当前仅支持8000和16000。UE默认采样44100。

PP网/尼龙网检测方案居然如此高效?

硅胶套是一种由硅胶材料制成的套管,通常用于保护、密封或绝缘电子元件、电线、电缆等。硅胶具有优异的耐高温、耐低温、耐化学腐蚀和绝缘性能,因此硅胶套常被用于需要抗高温、耐磨、耐腐蚀的环境中。硅胶套的柔软性和良好的弹性使其适合于包裹各种形状的…

python学习-容器类型

列表 列表(list)是一种有序容器,可以向其中添加或删除任意元素. 列表数据类型是一种容器类型,列表中可以存放不同数据类型的值,代码示例如下: 列表中可以实现元素的增、删、改、查。 示例代码如下: 增 …

SAP EWM display message对话框长度限制

1.问题 使用标准方法/scwm/cl_rf_dynpro_srvc=>display_message显示消息文本,由于消息文本过长而被截取,影响显示效果 2.解决 通过调试跟踪当前标准方法,发现屏幕显示长度为40,最多显示4行,且iv_msg_text把每一行显示字段用空格拼接起来,故以下代码需要把显示消息…

PHP全域旅游景区导览系统源码小程序

🌍【探索无界,畅游无忧】全域旅游景区导览系统小程序全攻略 📱【一键启动,智能导览在手】 告别纸质地图的繁琐,迎接全域旅游景区导览系统小程序的便捷时代!只需轻轻一点,手机瞬间变身私人导游…

图片kb太大了怎么改小?修改图片kb的方法介绍

图片kb太大了怎么改小?将图片的文件大小(以KB为单位)缩小可以带来多种优点,但也有一些缺点需要注意。缩小图片文件大小可以显著减少它在硬盘或其他存储设备上占用的空间,使你能够存储更多的图片和其他文件。而且&#…

配置webstorm按eslint规则自动格式化代码

项目使用了eslint,但是每次使用自动格式代码时,webstorm不会按照 eslint 规则去格式化代码 解决办法: 在项目根目录找到 .eslintrc.js 并右键单击,菜单底部有一个 "Apply ESLint Code Style Rule" 点它,之后…

几种常见的项目日志使用方法

目录 一、stdin/stdout/stderr 1、重定向 二、Log4cpp第三方库 一、stdin/stdout/stderr 在通常情况下,Linux/UNIX每个程序在开始运行的时刻,都会打开3个已经打开的stream. 分别用来输入,输出,打印诊断和错误信息。通常他们会被…

网页报错err_connection_timed_out 怎么办?教你快速修复错误代码

遇到网页错误提示“ERR_CONNECTION_TIMED_OUT”时,通常表示你的网络浏览器无法在规定时间内从服务器获取数据。这种错误不仅会阻碍你访问特定网站,而且可能会引起一些疑惑和不便。首先,这个问题可能是由于网络连接问题、服务器响应延迟或配置…

在MyBatis中,resultType 与 resultMap

在MyBatis中,resultType 和 resultMap 是用于映射SQL查询结果的两种方式。它们的使用和区别如下:

Win10屏幕录制,这3种方法分享给你

数字化时代里,电脑的屏幕录制功能已经不再是简单的工具,而是成为我们表达、学习和交流的重要媒介。Win10系统依然是大部分人使用的电脑系统,那么关于Win10屏幕录制,有哪些好用高效的录制软件,能够帮助我们更加深入地捕…

Redis+Caffeine 实现两级缓存实战

RedisCaffeine 实现两级缓存 背景 ​ 事情的开始是这样的,前段时间接了个需求,给公司的商城官网提供一个查询预计送达时间的接口。接口很简单,根据请求传的城市仓库发货时间查询快递的预计送达时间。因为商城下单就会调用这个接口&#xff…

基于 TI AM62 测试 QtWayland 部署

By Toradex秦海 1). 简介 目前主流的 ARM 平台嵌入式 Linux BSP 的显示后端基本都已经从 X11 升级到了 Wayland, 而常用的 Wayland Compositor - Weston 对于 Linux 下常用的 Qt 图形界面开发框架的一些 Plugin (比如 Qt VirtualKeyboard) 的配合并不完善&#xf…

科普文:HTTPS协议

概叙 HTTPS(Secure Hypertext Transfer Protocol)即安全超文本传输协议,是一个安全通信通道。用于计算机网络的安全通信,已经在互联网得到广泛应用。 HTTPS 是基于 HTTP 的扩展,其相当于 HTTP协议SSL(安全套…

什么是光储充一体化? 光储充一体化有什么优势?

大部分省份划定配储的比例不低于10% “光储充一体化”政策文件:国家层面政策名称 政策要点 发布时间 发布单位 结合实际建设光伏发电、储能、充换电一体化的充电基础设施。中央财政将安排奖励资金支持试点县开展试点工作,示范期内,每年均达到最高目标的试…

【教程】Hexo 部署到 Github Page 后,自定义域名失效的问题

目录 前言&问题描述解决方案细节 前言&问题描述 近期给 Github Page 上托管的静态网站映射了自定义域名(aiproducthome.top),之后发现每次更新并部署 hexo 到 Github Page (hexo d)后就会出现自定义域名失效的…

【linux】 sudo apt update报错——‘由于没有公钥,无法验证下列签名: NO_PUBKEY 3B4FE6ACC0B21F32’

【linux】 sudo apt update报错——‘由于没有公钥,无法验证下列签名: NO_PUBKEY 3B4FE6ACC0B21F32’ 在运行sudo apt update时遇到报错,由于没有公钥,无法验证下列签名: NO_PUBKEY 3B4FE6ACC0B21F32 解决方法&#x…

印刷企业如何判断数字工厂管理系统的实施周期

在数字化转型的浪潮中,印刷企业正积极拥抱新技术以提升生产效率、优化成本结构并增强市场竞争力。数字工厂管理系统的引入,作为这一转型的关键步骤,不仅能够实现生产流程的自动化、智能化监控,还能显著提升数据分析能力和决策效率…

【C语言】【排序算法】----- 归并排序

由于最近要考试,好久没有发博客了,非常抱歉大家对我的支持。之后我会不断更新博客,继续创作出高质量的文章,希望能帮到大家! 文章目录 一、归并排序基本思想二、递归实现三、非递归实现四、效率分析 一、归并排序基本…