Linux :进程的程序替换

news2024/10/11 12:30:03

目录

一、什么是程序替换

1.1程序替换的原理

1.2更改为多进程版本

二、各种exe接口

2.2execlp

 ​编辑

2.2execv

2.3execle、execve、execvpe


一、什么是程序替换

1.1程序替换的原理

用fork创建子进程后执行的是和父进程相同的程序(但有可能执行不同的代码分支),子进程往往要调用一种exec函数以执行另一个程序。当进程调用一种exec函数时,该进程的用户空间代码和数据完全被新程序替换,从新程序的启动例程开始执行。调用exec并不创建新进程,所以调用exec前后该进程的id并未改变。

就相当于在执行一个程序时,要从磁盘中将新的数据和代码加载到内存中,将老程序的数据和代码替换掉,这个现象就叫做程序替换。程序替换过程中并没有创建新的进程,而作为用户我们没有资格去直接进行程序替换,所以如果想实现程序替换,就必须使用系统调用execl。

即pcb这个内核数据结构不换,代码和数据换了。

第一个参数*Path是要寻找的程序,第二个参数*arg表示你想如何执行,而最后的...是可变参数列表。

我们可以通过这个指令来对ls指令进行模拟。

可以看到 ls命令很顺利的执行了,可pccontrol.c最后一个一个printf却没有执行,这是为什么呢?

答案很简单,因为程序被替换了。

execl只有失败返回没有成功返回。 比如给定一个不存在的路径。此时执行完毕后如果去echo $?就可以看到错误码为1。如果成功替换完成,不创建新的进程。

 而我们创建一个进程,是先创建PCB、地址空间、页表,然后再把程序加载到内存,而程序替换所做的工作就是加载。

1.2更改为多进程版本

 我们也可以创建一个子进程,让子进程去进行程序替换,这样父进程就可以得到运行结果,因为进程具有独立性,创建子进程后,当要让子进程去进行程序替换时就会发生写实拷贝,开辟新的空间,这样就不会影响父进程。

所以我们的shell运行原理我们也可以类推出来,当我们在shell中输入指令时,就会创建一个子进程,然后shell去wait等待子进程,子进程进行程序替换发生写时拷贝开辟新的空间,然后去执行。

二、各种exe接口

我们可以看到,一共有6个接口, 加上execv一共有7个接口。

2.2execlp

 

execlp,最后为p(PATH)的不需要告诉操作系统绝对路径,只需要告诉文件名。系统进行替换时会自动去PATH环境变量中查找。

 

最后的执行结果和execl是一样的 。

2.2execv

第一个参数是绝对或相对路径,第二个参数是argv,即命令行参数表,类似于main函数的参数。

而exec结尾为l表示list,即将元素以链表的形式传。

而v结尾表示vector,即以数组形式传。

execvp类比于上面的execlp

exec*可以执行系统的指令,也可以执行自己的程序,无论是什么语言,都可以在linux下跑。因为所有的语言运行之后都是进程。

2.3execle、execve、execvpe

这些函数原型看起来很容易混,但只要掌握了规律就很好记。
l(list) : 表示参数采用列表
v(vector) : 参数用数组
p(path) : 有p自动搜索环境变量PATH
e(env) : 表示自己维护环境变量

区别就是最后带上了环境变量的一个参数。

首先如果不使用带环境变量的调用,可以通过显示传的方式传给操作系统。我们也可以在C语言写的程序中去通过传参给一段C++ 代码编译成的可执行程序。

通过以上我们可以看到,通过子进程完成了进程切换成功运行了mytest文件并且将命令行参数传给了mytest的argv,父进程也成功回收了子进程。


以上传了命令行参数,那环境变量该如何传给要替换的程序呢?

当我们不显示去传环境变量表时会发生什么呢? 

子进程默认可以通过地址空间继承的方式,让所有子进程拿到环境变量。

进程程序替换,不会替换环境变量数据。

1.如果我们想让子进程继承全部的环境变量,直接就能拿到

2.如果单纯新增的话使用putenv("GA=AAAAAA");

3.如果想设置全新的环境变量,就可以用到execle


再次运行,环境变量就变成我们设置的全新的环境变量了,也叫覆盖方式。

 而这么多的接口功能上基本上不存在太大的差异,只是传参的区别以及使用方式不同,而程序替换真正的系统调用只有一个,就是上图所示的execve,其余所有的调用都是封装了execve。

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

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

相关文章

【Redis系列】Redis安装与使用

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

【群晖】NASTOOL-自动化处理影音视频工具

【群晖】NASTOOL-自动化处理影音视频 本文主要从获取、部署、使用、配置等方面进行手把手教学如何使用nastool工具进行影音视频自动化处理。从此靠别繁琐的网上各个网址找资源-下载-复制-改名-刮削等操作。 准备 DSM 7.1 (我使用的是群晖 7.1 系统,不管…

JVM剖析

0.前言 Java 是当今世界使用最广泛的技术平台之一。使用 Java 或 JVM 的一些技术包括: Apache spark用于大数据处理,数据分析在JVM上运行;用于数据流的Apache NiFi在内部使用的也是 JVM;现代 Web 和移动应用程序开发中使用的React native使用 的也包含…

【代码篇】事件监听函数的内存泄漏,都给我退散吧!

前言 内存泄漏是个很严肃的问题,可是迄今也没有一个非常有效的排查方案,本方案就是针对性的单点突破。 工作中,我们会对window, DOM节点,WebSoket, 或者单纯的事件中心等注册事件监听函数, 添加了,没有移除&#xff…

网络爬虫:爬取假数据

网络爬虫:爬取假数据 文章目录 网络爬虫:爬取假数据前言一、项目介绍:二、项目来源:三、架构图:(流程图)四、使用了什么技术:(知识点)五、结果示意图&#xf…

网络安全 | 什么是单点登录SSO?

关注WX:CodingTechWork SSO-概念 单点登录 (SSO) 是一种身份认证方法,用户一次可通过一组登录凭证登入会话,在该次会话期间无需再次登录,即可安全访问多个相关的应用和服务。SSO 通常用于管理一些环境中的身份验证,包…

obs直播推流 + ffmpeg参数

OBS 启动参数设为 --startstreaming , 可以让它启动后自动开始直播 对应ffmpeg参数: echo off :loop ffmpeg -re -i a.mp4 -r 24 -c:v libx264 -preset ultrafast -profile:v baseline -g 24 -keyint_min 24 -x264-params nal-hrdcbr -b:v 2500k -minr…

线上研讨会 | 应对汽车毫米波雷达设计中的电磁挑战

智能汽车、新能源汽车最近几年一直是汽车行业关注的热点,随着5G技术越来越普及,汽车智能化发展将越来越迅速。从传统汽车到智能汽车,不是简单功能的增强,而是从单一功能的交通工具变成可移动的办公和娱乐空间,成为物联…

蓝桥杯python组真题练习1

目录 1.单词分析 2.成绩统计 3.门牌制作 4.卡片 5.跑步训练 6.蛇形填数 7.时间显示 1.单词分析 1.单词分析 - 蓝桥云课 (lanqiao.cn) s list(input()) maxx 0 for i in s:num s.count(i)if num>maxx:sm imaxx numif num maxx:if ord(sm)>ord(i):sm i print…

AcWing-孤独的照片

4261. 孤独的照片 - AcWing题库 所需知识:贡献法 整体思路:首先想到暴力枚举所有区间,判断每个区间内是否有一种牛的数量是一只(提前用前缀和存放每个位置及以前的牛的数量) C代码:(过不了&a…

【科研笔记】知识星球不可选择内容爬虫

知识星球不可选择内容爬虫 1 背景2 实现3 拓展遗留问题1 背景 针对与知识星球中,电脑打开网页不可选择复制粘贴的问题,进行爬虫处理,获取网页的内容,并保存在本地 2 实现 需要下载python,和爬虫的第三方库selenium,可以查看博客中有关selenium的内容进行回顾。当前使用…

安装Pillow库的方法最终解答!_Python第三方库

安装Python第三方库Pillow 我的环境:Window10,Python3.7,Anaconda3,Pycharm2023.1.3 pillow库 Pillow库是一个非常强大的图像处理库。它提供了广泛的图像处理功能,让我们可以轻松地读取和保存图像、创建缩略图和合并到…

开源软件技术社区方案

开源软件技术社区是一个由开发者、贡献者、用户和维护者组成的共享平台,主要目的是打造技术、软件产品良性互动、开源技术安全可控的软件生态环境,实现可复用应用或服务的快速部署与使用、完成资源与能力的高度共享、促进社区成员的共建共赢,…

利用Python和Selenium实现定时任务爬虫

网络爬虫在信息获取、数据分析等领域发挥着重要作用,而定时爬虫则可以实现定期获取网站数据的功能,为用户提供持续更新的信息。在Python中,结合Selenium技术可以实现定时爬虫的功能,但如何设置和优化定时爬虫的执行时间是一个关键…

4.7 数组的读取和写入,type指令和一些杂项

4.7 数组的读取和写入,type指令和一些杂项 可以通过word ptr将db转为dw,然后按照dw的方式去存储数据 1. 段名也可以把其地址赋给变量 assume cs:codesg,ds:data,ss:stack data segmentdb 12,34dw 12,34db hello world data ends stack segmentdb 10 dup…

Android JNI基础

目录 一、JNI简介1.1 什么是JNI1.2 用途1.3 优点 二、初探JNI2.1 新建cpp\cmake2.2 build.gradle配置2.3 java层配置2.4 cmake和c 三、API详解3.1 JNI API3.1.1 数据类型3.1.2 方法 3.2 CMake脚本 四、再探JNI 一、JNI简介 1.1 什么是JNI JNI(Java Native Interfa…

医疗器械网络安全 | 美国FDA审批程序和欧盟合格评定程序的区别

要进入美国与欧洲市场,均需要通过评定程序审批。 两者的审批流程核心区别在于:所有在美国上市流通的医疗器械产品必须经过FDA的审核认证,才能投放市场。而欧盟市场,医疗器械制造商只需要自证设备合规性,并有指定机构干…

5.2 通用代码,数组求和,拷贝数组,si配合di翻转数组

5.2 通用代码,数组求和,拷贝数组,si配合di翻转数组 1. 通用代码 通用代码类似于一个用汇编语言写程序的一个框架,也类似于c语言的头文件编写 assume cs:code,ds:data,ss:stack data segmentdata endsstack segmentstack endsco…

超文本传输协议HTTP

HTTP协议 在网络通信中,我们可以自己进行定制协议,但是也有许多已经十分成熟的应用层协议,比如我们下面说的HTTP协议。 HTTP协议简介 HTTP(Hyper Text Transfer Protocol)协议又叫做超文本传输协议,是一…

前端html+css+js常用总结快速入门

🔥博客主页: A_SHOWY🎥系列专栏:力扣刷题总结录 数据结构 云计算 数字图像处理 力扣每日一题_ 学习前端全套所有技术性价比低下且容易忘记,先入门学会所有基础的语法(cssjsheml)&#xff…