【Linux】进程替换

单进程版的进程替换:

现象:

运行结果:

没有执行execl后面的代码;

基本原理:

其实就相当于我自己对应的程序在运行的时候,
这个可乘程序一旦用execl来加载起来,做法特别简单粗暴,它就拿着新程序的代码替换老程序的代码,新程序的数据替换老新程序的数据替换老程序的数据

exec* 后续的代码执行替换失败会怎样?

才可能执行后续代码exec* 函数,只有失败返回值,没有成功返回值!!



换完之后呢,让我们对应的CPU执行当前新程序对应的入口地址,让我们直接执行新程序


整个过程之中,我们只是把当前进程的代码和数据进行了替换,而并没有更改当前进程,尤其是没有创建新进程这就叫做程序替换。

多进程版的程序替换:

现象:folk后,由子进程来执行对应的这个程序替换的时候,我们的父进程看起来是没有受影响的。


可是在单进程版的时候,我们发现我们的进程直接就被替换掉了。
当我们在进行创建子进程的时候,子进程进行程序替换,那么并不会影响父进程。
这时因为我们有写实拷贝技术以及进程之间是要保留自己所对应的独立性
所以我们程序替换并不影响父进程。

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

不创建新进程,只进行进程的程序代码和数据的替换工作!

我们的CPU如何得知程序的入口地址?

Linux中形成的可执行程序,是有格式的,ELF, 可执行程序的表头,可执行程序的入口地址就在表中!!!

其实表中所有的除了代码和数据,其他属性信息也能拿到,
一方面初始化诸如地址空间,页表这样的结构。
一方面报告诉CPU代码从哪里入口
所以当我们重新替换时,它就知道原来一旦替换成功之后,就从新程序开始,从零开始执行了。

替换函数:

其实有六种以exec开头的函数,统称exec函数:

int execl(const char *path, const char *arg, ...);//命令行怎么写,就怎么传
int execlp(const char *file, const char *arg, ...);
int execle(const char *path, const char *arg, ...,char *const envp[]);
int execv(const char *path, char *const argv[]);
int execvp(const char *file, char *const argv[]);

这些函数原型看起来很容易混,但只要掌握了规律就很好记。

第一个参数:决定如何找到该程序,以全路径或者相对路径的形式

后面的参数:如何执行这个程序,主要是要不要涵盖选项,涵盖哪些?
l(list) : 表示参数采用列表(命令行怎么写就怎么传)
v(vector) : 参数用数组
p(path) : 有p自动搜索环境变量PATH
e(env) : 表示环境变量

...:可变参数,如果对应的函数它的参数个数是不定的,所以c、c++会给我们提供可变参数。

int execve(const char *path, char *const argv[], char *const envp[]);

只有execve是真正的系统调用,其它五个函数最终都调用 execve,所以execve在man手册 第2节,其它函数在 man手册第3节。

这里的const的意思是:

指针不可被修改,而不是指针指向的内容不可被修改。

使用样例:

execl

在.cpp文件中

在.c文件中:

在makefile中:

运行即可用.c文件调用.cpp文件

execv

在.c文件中:

在.cpp文件中:

运行:

在默认情况下,即便是你没有给它传环境变量,这个环境变量的信息自动也会被我们的子进程拿到。

那么环境变量是什么时候给进程的呢?

环境变量也是数据,创建子进程的时候,环境变量就已经被子进程继承下去了!!!

所以,程序替换中,可以替换程序的代码和数据,但环境变量信息,不会被替换!!!

如果想给子进程传递环境变量,该怎么传递? 

1新增环境变量:(父进程的地址空间中直接putenv!)

在.c文件中:

./运行之后:

2.彻底替换

如果传自己的环境变量呢?

在.c文件中:

make运行之后:

我们发现只有自己定义的环境变量。

所以在传递自定义的环境变量时,采取的策略时覆盖,而不是追加

shell脚本

.sh结尾的这种就是我们对应的文件。

脚本语言上面所有的开头都以#!开头。


那么后面紧跟的是我们脚本语言的解释器(说一下脚本语言并不是脚本在跑,那么而是由解释器来解释式的执行的,脚本语言就是文本文件)

所谓的脚本语言呢?
其实就是这个bash就是命令行解释器
从对应的这个文件里,一行一行地把内容拿出来拿出来之后,然后帮我们进行一行一行的去执行
这就叫做命令行解释器以及对应的脚本语言

c语言把shell脚本调起来怎么调?

.c文件中:

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

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

相关文章

java--多态

1.什么是多态 多态是在继承/实现的情况下的一种现象,表现为:对象多态、行为多态。 2.多态的具体代码体现 编译看左边,运行看右边 3.多态的前提 有继承/实现关系;存在父类引用子类对象;存在方法重写 4.多态的一个注…

基于SSM乡镇自来水收费系统的设计与实现

摘 要 互联网发展至今,无论是其理论还是技术都已经成熟,而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播,搭配信息管理工具可以很好地为人们提供服务。针对乡镇自来水收费信息管理混乱,出错率高,信息安…

ARMV8 - 汇编指令 - 存储器读写指令

说明 存储器读写指令是用来读写内存/SRAM/外设寄存器等存储器的汇编指令。ARM指令集属于RISC指令集,RISC指令集采用典型的加载/存储体系结构,CPU无法对内存里的数据直接操作,只能通过Load/Store指令来实现,当我们需要对内存中的数…

Windows10找不到hosts文件的解决办法

正常情况下hosts文件在目录C:\Windows\System32\drivers\etc中,最近新装的Windows10系统发现该目录下没有hosts文件。 如下操作显示隐藏文件发现还是没有。 执行如下命令hosts文件出现: for /f %P in (dir %windir%\WinSxS\hosts /b /s) do copy %P …

分布式技术(一)分布式的架构的演进

💌 所属专栏:【微服务】😀 作 者:长安不及十里💻 工作:目前从事电力行业开发🌈 目标:全栈开发🚀 个人简介:一个正在努力学技术的Java工程师,专注基…

实现校园网开机自启动部署

❤️博客主页: iknow181🔥系列专栏: Python、JavaSE、JavaWeb、CCNP🎉欢迎大家点赞👍收藏⭐评论✍ 目录 一.准备工作 1、IDE安装 2、安装Selenium 1.介绍 2.下载 3、安装pywifi 1.介绍 2.下载 4、下载浏览器驱…

毫无基础的人如何入门 Python ?--找对学习入口是关键!

1.行百里者半三十 不少学生或职场人士总面临这样一种窘境:数字化转型大背景、大趋势下,感觉非常有必要学习Python等分析工具,但在真正学习Python的各种语言规则时,往往体验不到知识的乐趣,翻看个别章节后即束之高阁。…

7.golang指针

指针是存储另一个变量的内存地址的变量。 指针的声明 func main() {a : 255b : &afmt.Println(b)fmt.Println(*b) }& 操作符获取一个变量的指针地址。* 操作符获取指针地址的值。程序的输出为: 0xc00000a0d8 255

VUE2+THREE.JS辉光设定和解决辉光导致背景变暗的问题

THREE.JS辉光设定和解决辉光导致背景变暗的问题 THREE.JS 辉光设定THREE.JS 辉光导致背景变暗的问题1.设定背景图片2.初始化辉光3. animate 一直渲染辉光 THREE.JS 辉光设定 给我的设计好的fbx模型,已经设定好了模型发光材质,所以直接添加辉光效果,就可以自动发光 blender模型生…

前馈全连接层

B站教学视频链接:2.3.4前馈全连接层-part2_哔哩哔哩_bilibili

力扣1089题 复写零 双指针解法

2. 复写零 给你一个长度固定的整数数组 arr ,请你将该数组中出现的每个零都复写一遍,并将其余的元素向右平移。 注意:请不要在超过该数组长度的位置写入元素。请对输入的数组 就地 进行上述修改,不要从函数返回任何东西。 示例 1&…

微信小程序input type=nickname不能触发隐私政策?小程序隐私协议开发指南之nickname权限篇

小程序隐私协议开发指南之nickname权限篇 涉及处理用户个人信息的小程序开发者,需通过弹窗等明显方式提示用户阅读隐私政策等收集使用规则。 为规范开发者的用户个人信息处理行为,保障用户合法权益,微信要求开发者主动同步微信当前用户已阅读并同意小程序的隐私政策等收集使…

docker 推送tar包到远程仓库

tar 包 推送到远程仓库的步骤 - 导入镜像(docker load -i 镜像名称)示例:docker load -i yiyi-admin.tar- 打标签(docker tag 镜像id registry.cn-hangzhou.aliyuncs.com/空间名称/镜像名称:版本号)示例:docker tag $image_id reg…

Android 12.0 修改Android系统的通知自动成组的数量

场景: Android 系统对显示在通知列表中的同一个应用的通知进行分组管理,即相同的packageName中,当通知数量达到系统默认指定的数量时,会自动成一组. Android 12.0 中系统默认的自动成组数如下所示: 核心路径 : frameworks/base/core/res/res/values/config.xml<!-- 来自同…

AI 编程如何助力开发者高效完成架构设计工作?

▼最近直播超级多&#xff0c;预约保你有收获 今晚直播&#xff1a;《AI 编程技术架构剖析和案例开发实战》 —1— AI 编程能帮我们完成哪些工作&#xff1f; 从目前企业级种种现实场景应用来看&#xff0c;AI 编程已经成为一种帮助开发者解决架构设计复杂问题、提高编程效率以…

adb 命令获取当前页面的包名

adb shell "dumpsys window | grep mCurrentFocus"

使用OpenCompass评测rwkv模型教程

0x0. 前言 继续MLC-LLM 支持RWKV-5推理以及对RWKV-5的一些思考文章里面提到的想法&#xff0c;探索一下使用OpenCompass来评测RWKV模型&#xff0c;对模型的实际表现有一个更客观的了解。我在尝试的过程中也碰到了一些问题&#xff0c;所以这里记录一下使用OpenCompass评测的流…

Node【工具 01】Node Version Manager nvm安装使用(Node.js版本管理工具)

1.介绍 非专业前端开发工程师在构建项目时遇到如下问题&#xff1a; ERROR: This version of pnpm requires at least Node.js v16.14 The current version of Node.js is v14.17.0 Visit https://r.pnpm.io/comp to see the list of past pnpm versions with respective Nod…

【doccano】文本标注工具——属性级情感分析标注自己的业务数据

笔记为自我总结整理的学习笔记&#xff0c;若有错误欢迎指出哟~ 【doccano】文本标注工具——属性级情感分析标注自己的业务数据 1.说明2.前提条件3.doccano创建项目4.添加数据集5.添加标签6.标注数据7.导出数据转换格式 1.说明 2.前提条件 确保doccano已经安装完成 可以参考文…

Python实现的二分查找算法(非递归实现)

一、二分查找算法的优缺点&#xff1a; 二分查找又称折半查找&#xff0c;优点是比较次数少&#xff0c;查找速度快&#xff0c;平均性能好&#xff1b;其缺点是要求 待查表为有序表&#xff0c;且插入删除困难。因此&#xff0c;二分查找方法适用于不经常变动而查找频繁的有 …