【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://www.mzph.cn/news/869707.shtml

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

相关文章

js实现图片放大镜功能,简单明了

写购物项目的时候&#xff0c;需要放大图片&#xff0c;这里用js写了一个方法&#xff0c;鼠标悬浮的时候放大当前图片 这个是class写法 <!--* Descripttion: * Author: 苍狼一啸八荒惊* LastEditTime: 2024-07-10 09:41:34* LastEditors: 夜空苍狼啸 --><!DOCTYPE …

7.10号小项目部分说明

总体说明 糖锅小助手 我这次主要对上次糖锅小助手界面添加了一个侧边栏&#xff08;侧边输入框放置了三个按钮&#xff0c;可以跳转到其他ai聊天界面&#xff0c;还可以退出聊天界面回到登录界面&#xff09;和一个日期输入框&#xff08;日期输入框获取时间&#xff0c;根据时…

Ubuntu固定虚拟机的ip地址

1、由于虚拟机网络是桥接&#xff0c;所以ip地址会不停地变化&#xff0c;接下来我们就讲述ip如何固定 2、如果apt安装时报错W: Target CNF (multiverse/cnf/Commands-all) is configured multiple times in /etc/apt/sources.list:10&#xff0c; 检查 /etc/apt/sources.list…

分类模型的算法性能评价

一、概述 分类模型是机器学习中一种最常见的问题模型&#xff0c;在许多问题场景中有着广泛的运用&#xff0c;是模式识别问题中一种主要的实现手段。分类问题概况起来就是&#xff0c;对一堆高度抽象了的样本&#xff0c;由经验标定了每个样本所属的实际类别&#xff0c;由特定…

Type-C/DP1.4到HDMI2.0替代龙讯LT8711HE,集睿智远CS5262

NCS8622是一款高性能低功耗的Type-C/DP1.4到HDMI2.0转换器&#xff0c;设计为连接USB Type-C源或DP1.4源到HDMI2.0。 NCS8622集成了符合DP1.4标准的接收器&#xff0c;以及符合HDMI2.0标准的发射器。此外&#xff0c;CC控制器用于将CC通信到实现DP Alt模式。DP接收器集成了HDCP…

什么是数据同步服务RSYNC?

大家好呀&#xff01;这里是码农后端。今天来介绍一下数据同步服务RSYNC&#xff0c;作为Linux/Unix系统中远程或本地复制同步&#xff08;复制&#xff09;文件和目录最常用的命令&#xff0c;相比于scp命令&#xff0c;其具有增量备份、数据同步时保持文件的原有属性等优点。…

在Linux上安装和配置RocketMQ:保姆级教程

感谢您阅读本文&#xff0c;欢迎“一键三连”。作者定会不负众望&#xff0c;按时按量创作出更优质的内容。 ❤️ 1. 毕业设计专栏&#xff0c;毕业季咱们不慌&#xff0c;上千款毕业设计等你来选。 当安装RocketMQ时&#xff0c;确保遵循以下步骤&#xff1a; 步骤概述 安装 …

flask模块化、封装使用缓存cache(flask_caching)

1.安装flask_caching库 pip install flask_caching 2.创建utils Python 软件包以及cache_helper.py 2.1cache_helper.py代码 from flask_caching import Cachecache Cache()class CacheHelper:def __init__(self, app, config):cache.init_app(app, config)staticmethoddef…

智能微服务调度:Eureka中的区域感知性配置指南

智能微服务调度&#xff1a;Eureka中的区域感知性配置指南 引言 在构建全球分布式系统时&#xff0c;服务的可用性区域感知性是确保用户体验和系统弹性的关键因素。Eureka&#xff0c;作为Netflix开源的服务发现框架&#xff0c;提供了区域感知性配置&#xff0c;允许服务消费…

ES6 之 Promise 构造函数知识点总结 (四)

Promise 是异步编程的一种解决方案&#xff0c;比传统的解决方案——回调函数和事件——更合理和更强大。它由社区最早提出和实现&#xff0c;ES6 将其写进了语言标准&#xff0c;统一了用法&#xff0c;原生提供了 Promise 对象。 Promise 对象有以下两个特点。 对象的状态不受…

基于swagger插件的方式推送接口文档至torna

目录 一、前言二、登录torna三、创建/选择空间四、创建/选择项目五、创建/选择应用六、获取应用的token七、服务推送7.1 引入maven依赖7.2 test下面按照如下方式新建文件 一、前言 Torna作为一款企业级文档管理系统&#xff0c;支持了很多种接口文档的推送方式。官方比较推荐的…

centos8安装python3.8.19并在python虚拟环境运行程序

一、安装python3.8.19 1.1 下载python 安装包 wget https://www.python.org/ftp/python/3.8.19/Python-3.8.19.tgz 1.2 操作系统安装一些库 yum -y install bzip2 bzip2-devel ncurses openssl openssl-devel openssl-static xz lzma xz-devel sqlite sqlite-devel gdbm gd…

DP(开篇) | Java | 动态规划相关知识点总结

《代码随想录 - 动态规划理论基础》 简介 动态规划&#xff0c;英文&#xff1a;Dynamic Programming&#xff0c;简称DP&#xff0c;如果某一问题有很多重叠子问题&#xff0c;使用动态规划是最有效的。 所以动态规划中每一个状态一定是由上一个状态推导出来的&#xff0c;…

防火墙安全策略与用户认证综合实验

一、实验拓扑 二、实验需求 1.DMZ区内的服务器&#xff0c;办公区仅能在办公时间内<9:00-18:00>可以访问&#xff0c;生产区的设备全天可以访问 2.办公区不允许访问互联网&#xff0c;办公区和游客区允许访问互联网 3.办公区设备10.0.2.10不充许访问DMZ区的FTP服务器和HT…

【java计算机毕设】个人理财管理系统MySQL springboot html maven小组设计项目源码代码

目录 1项目功能 2项目介绍 3项目地址 1项目功能 【java计算机毕设】个人理财管理系统MySQL springboot html maven小组设计项目源码代码 2项目介绍 系统功能&#xff1a; 个人理财管理系统包括管理员、用户两种角色。 管理员功能&#xff1a; 用户信息管理&#xff08;…

ns3学习笔记(四):路由概述

基于官网文档的 Routing Overview 部分详细研究一下ns3中路由是怎么工作的 文档链接16.4. Routing overview — Model Library 一、概述 NS3整体的工作架构如下&#xff1a; 路由部分的工作架构如下&#xff1a; 路由部分目前大多数用到的算法都包含在Ipv4RoutingProtocol部分…

将格内多行文字展开成多格

表格的A列是分类&#xff0c;B列由多行文字组成&#xff0c;即分隔符是换行符。 AB1Account NumberInteraction21Jan 1,2023 - Hello.32Jan 2, 2023 - Good morning. Jan 3, 2023 - Good night. Jan 4, 20 Jan 5, 2023 - Good night. Jan 6, 2023 - Good afternoon.43Jan 1,20…

基于Java技术的网上图书商城系统

你好呀&#xff0c;我是计算机学姐码农小野&#xff01;如果有相关需求&#xff0c;可以私信联系我。 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;Java技术、SpringBoot框架 工具&#xff1a;Eclipse、Navicat、Maven 系统展示 首页 用户注册界面…

RK3588开发笔记-ES8311音频芯片调试记录

目录 前言 一、ES8311 二、原理图连接 三、内核配置 四、设备树配置 五、设备调试 总结 前言 本篇博客主要记录如何在RK3588平台上调试ES8311音频芯片的过程。这包括硬件连接、内核配置、驱动程序调试和测试步骤。 一、ES8311 ES8311是一款高性能、低功耗的音频Codec,支持…

1996-2023年各省农村居民人均消费支出数据(无缺失)

1996-2023年各省农村居民人均消费支出数据&#xff08;无缺失&#xff09; 1、时间&#xff1a;1996-2023年 2、来源&#xff1a;国家统计局、统计年鉴 3、指标&#xff1a;农村居民人均消费支出 4、范围&#xff1a;31省 5、缺失情况&#xff1a;无缺失 6、指标解释&…