【Linux】---进程程序替换

news2024/11/18 11:40:18
进程替换出现的背景
我们可以用fork函数来创建子进程,使父子进程同时出现。正所谓子承父业,子进程在刚被创建时和父进程共享数据和代码,但是操作者想让子进程执行一个全新的程序,这个使子进程执行全新程序的操作叫做 进程程序替换
    • 替换原理

1.1替换的原理和底层

进程不变,仅仅替换当前 进程代码和数据的技术,叫做 进程程序替换。并 没有创建新的进程
程序替换本质就是 把程序的代码+数据,加载到特定进程的上下文中。C/C++程序要运行,必须要先加载内存中,如何加载呢?是通过加载器,加载器的底层原理就是一系列的exec*程序替换函数。
  • 用fork创建子进程后,子进程执行的是和父进程相同的程序(但有可能执行不同的代码分支),若想让子进程执行另一个程序,往往需要调用一种exec函数

  • 当进程调用一种exec函数时,该进程的用户空间代码和数据完全被新程序替换,并从新程序的启动例程开始执行。

1.2进程替换时创建新进程没?

进程程序替换之后,该进程对应的 PCB进程地址空间以及 页表等数据结构都没有发生改变,只是 进程在物理内存当中的数据和代码发生了改变,所以并没有创建新的进程,而且进程程序替换前后该进程的pid并没有改变。

1.3对父进程的代码和数据的影响?

子进程刚被创建时,与父进程共享代码和数据,但当子进程需要进行进程程序替换时,也就意味着子进程需要对其数据和代码进行写入操作,这时便需要 将父子进程共享的代码和数据进行写时拷贝,此后父子进程的代码和数据也就分离了,因此子进程进行程序替换后不会影响父进程的代码和数据。

2.替换函数

提起进程替换,就不得不说到替换函数,替换函数有6种,他们均是以exec开头的,又把他们统称为exec函数。

exec把当前进程映像替换成新的程序文件,而且该新程序通常从main函数开始执行。进程ID并不改变。我们称调用exec的进程为 调用进程(calling process),称新执行的程序为新程序(new program)。

2.1六大函数介绍

#include <unistd.h>`

int execl(const char *path, const char *arg, ...);
int execv(const char *path, char *const argv[]);
int execlp(const char *file, const char *arg, ...);
int execvp(const char *file, char *const argv[]);
int execle(const char *path, const char *arg, ...,char *const envp[]);
int execve(const char *path, char *const argv[], char *const envp[]);
函数参数:
path:用来替换的程序所在的路径
file:程序名
arg, …:列表的形式传参
arg[]:数组的形式传参
envp[]:自己维护的环境变量
  • 特殊记忆法进行特殊记忆

替换函数接口

参数格式

采用方法

l

list

参数采用列表方式

v

vector

参数采用数组方式

p

path

自动搜索环境变量PATH

e

env

自己维护环境变量,或者说自定义环境变量

函数名

参数格式

是否带路径

是否使用当前环境变量

execl

列表(l)

是(path)

execv

数组(v)

是(path)

execlp

列表(l)

execvp

数组(v)

execle

列表(l)

是(path)

否,自己组装环境变量

execve

数组(v)

是(path)

否,自己组装环境变量

接下来让我们一一介绍一下:

1.execl函数

int execl(const char *path, const char *arg, ...);
第一个参数是要执行程序的路径第二个参数是可变参数列表,表示你要如何执行这个程序, 并以NULL结尾。

假如要执行ls指令:

execl("/usr/bin/ls", "ls", "-a", "-i", "-l", NULL);

2.execv函数

int execv(const char *path, char *const argv[]);
第一个参数是要执行程序的路径第二个参数是一个指针数组,数组当中的内容表示你要如何执行这个程序, 数组以NULL结尾

假如要执行ls指令:

char* myargv[] = { "ls", "-a", "-i", "-l", NULL };
execv("/usr/bin/ls", myargv);

3.execlp函数

int execlp(const char *file, const char *arg, ...);
第一个参数是要执行程序的名字,第二个参数是可变参数列表,表示你要如何执行这个程序,并以NULL结尾。

假如要执行的是ls程序。

execlp("ls", "ls", "-a", "-i", "-l", NULL);

4.execvp函数

int execvp(const char *file, char *const argv[]);
第一个参数是要执行程序的名字第二个参数是一个指针数组,数组当中的内容表示你要如何执行这个程序, 数组以NULL结尾

假如要执行ls指令:

char* myargv[] = { "ls", "-a", "-i", "-l", NULL };
execvp("ls", myargv);

5.execle函数

int execle(const char *path, const char *arg, ...,char *const envp[]);
第一个参数是要执行程序的路径第二个参数是可变参数列表,表示你要如何执行这个程序,并 以NULL结尾第三个参数是你自己设置的环境变量

假如你设置了MYVAL环境变量,在mycmd程序内部就可以使用该环境变量。

char* myenvp[] = { "MYVAL=2021", NULL };
execle("./mycmd", "mycmd", NULL, myenvp);

6.execve函数

int execve(const char *path, char *const argv[], char *const envp[]);
第一个参数是要执行程序的路径第二个参数是一个指针数组,数组当中的内容表示你要如何执行这个程序, 数组以NULL结尾第三个参数是你自己设置的环境变量

假如设置了MYVAL环境变量,在mycmd程序内部就可以使用该环境变量:

char* myargv[] = { "mycmd", NULL };
char* myenvp[] = { "MYVAL=2023", NULL };
execve("./mycmd", myargv, myenvp);

2.2函数的返回值

  • 这些函数如果调用成功,则加载指定的程序并从启动代码开始执行,不再返回

  • 如果调用出错,则返回-1。

大胆的理解:只要返回值了,那就意味着调用失败了。

2.21六大函数的关系

只有execve才是真正的系统调用,其它五个函数最终都是调用的execve,也就是说其他五个函数实际上是对系统调用execve进行了封装,以满足不同用户的不同调用场景的。

测试实例:

int main()
{
    // 自己组装的环境变量
    char* myenv[] = {"MYENV=you can see my", NULL};
    
    // 列表形式传参
    execl("/usr/bin/ls", "ls", "-l", "-a", NULL);
    execp("ls", "ls", "-l", "-a", NULL);
    exece("./mycmd", "mycmd", NULL, myenv);

    // 数组形式传参
    char* const argv[] = {"ls", "-l", "-a", NULL};
    execv("/usr/bin/ls",argv);
    execvp("ls", argv);
    char*  const agrv1[] = {"mycmd", NULL};
    execve("./mycmd", agrv1, myenv);// 调用自己的程序
}

还有几点需要解释一下:

程序替换成功后,运行完新程序,则程序直接退出;程序替换成功后,原进程没有退出,使用原进程运行新程序

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

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

相关文章

前端播放大视频卡顿的解决(m3u8视频流)

前言 最近在一个大屏看板项目中有一个需求是&#xff1a;要求视频和看板要进行来回切换。 最开始的做法是将MP4视频放在项目里&#xff0c;在本地运行时是没什么问题的&#xff0c;但是在往仓库里提交代码时出现了问题。当单个文件超过100MB时会导致代码提交失败&#xff1b; …

【闲聊杂谈】直击重灾区 - 多线程与高并发

在开始学习多线程与高并发的知识之前&#xff0c;我想先问一个问题&#xff1a;你平时在写代码的时候&#xff0c;有没有刻意的去思考如何压榨CPU性能&#xff1f;其实纵观整个编程的发展历史&#xff0c;其实就是一部对于CPU性能压榨的血泪史。 单进程人工切换 最早的编程…

@Reference、@Autowired、@Resource的区别

目录 1. Autowired 和 Resource 的区别相同点&#xff1a;不同点&#xff1a;Resource 装配顺序2. Reference 和 Autowired 的区别理解1理解2理解31. Autowired 和 Resource 的区别 相同点&#xff1a; Resource 的作用相当于Autowired &#xff0c;均可标注在字段或属性的se…

4、因果法

因果图中的图形符号 恒等。若原因出现&#xff0c;则结果出现&#xff1b;若原因不出现&#xff0c;则结果不出现。非。若原因出现&#xff0c;则结果不出现&#xff1b;若原因不出现&#xff0c;则结果出现。或。若几个原因中有一个出现&#xff0c;则结果出现&#xff1b;若几…

章节8 文本编辑器

8-Linux文本编辑器 文本编辑器 Windows&#xff1a;Notepad&#xff08;记事本&#xff09;、Sublime、UltraEdit等 Linux&#xff1a;VI/VIM &#xff08;最常用&#xff09;、nano、Emacs、Sed、gedit、Kate等 01 VI和VIM的区别 VI和VIM的区别 VI&#xff1a;Visual In…

C 语言零基础入门教程(十六)

C 位域 如果程序的结构中包含多个开关量&#xff0c;只有 TRUE/FALSE 变量&#xff0c;如下&#xff1a; struct {unsigned int widthValidated;unsigned int heightValidated; } status;这种结构需要 8 字节的内存空间&#xff0c;但在实际上&#xff0c;在每个变量中&#…

云计算|OpenStack发展简史

前言&#xff1a; 一般以open开始的软件都非常的牛逼&#xff0c;例如&#xff0c;OpenCV&#xff08;人工智能学习库&#xff09;&#xff0c;OpenStack&#xff08;云计算基础操作系统&#xff09;&#xff0c;openwrt&#xff08;软路由&#xff09;&#xff0c;openEuler&…

表单设计器

表单设计器目录概述需求&#xff1a;设计思路实现思路分析参考资料和推荐阅读Survive by day and develop by night. talk for import biz , show your perfect code,full busy&#xff0c;skip hardness,make a better result,wait for change,challenge Survive. happy for h…

vue2.x 富文本编辑器Tinymce的使用

VUE项目版本是2.x&#xff0c;切记&#xff1a; vue2中不能使用tinymce/tinymce-vue为4以上版本&#xff1b; 如果有安装高版本&#xff0c;卸载&#xff1a;npm uninstall tinymce/tinymce-vue 第一步&#xff1a;安装 npm install tinymce5.1.0 -S npm install tinymce/tiny…

费曼学习法——孩子弱点方向的提升和沟通技巧

这一篇虽然是兔年第一篇&#xff0c;但是&#xff0c;先不拜年了&#xff0c;主要是成文时间较短&#xff0c;后面会有一个详细的长篇文字&#xff0c;讨论一些观点和看法。每一个孩子都有弱点的方向&#xff0c;我们是否都要给孩子提升&#xff0c;首先表达一个观点&#xff1…

图论算法基础

图论算法基础有向图有向图的实现方式无向图无向图的实现方式连通图连通分量的定义强连通图和强连通分量的定义弱连通图和单向连通图的定义判断图是否是强连通图&#xff0c;弱连通图还是单项连通图一个很典型的错误代码JAVA实现C实现生成树最小生成树拓扑排序邻接表的实现方式数…

【ShaderGraph】道路引导,小溪流水等UV动画效果

目录 一&#xff1a;创建ShaderGraph文件 二&#xff1a;设置UV动画速度变量 ​三&#xff1a;设置UV动画方向和Tiling变量 ​四&#xff1a;设置贴图属性 五&#xff1a;设置主色MainColor属性 六&#xff1a;最终效果 一&#xff1a;创建ShaderGraph文件 1.在assets下…

css之BFC是什么

在讲BFC之前先来了解一下FC FC-Formatting Context FC全称Formatting Context(格式化上下文)&#xff0c;元素在标准流里面都属于一个FC的 官网解释&#xff1a; Boxes in the normal flow belong to a formatting context,which may be block or inline, but not both sim…

指针(基础)

目录 一、内存和地址 二、指针是什么&#xff1f; 三、指针变量的内容 四、指针类型 五、间接访问操作符 &#xff08;一&#xff09;易混淆 六、野指针 &#xff08;一&#xff09;野指针成因 1. 指针未初始化 2. 指针越界访问 3. 指针指向的空间释放 &…

php xss攻击

文章目录一、什么是xss攻击二、攻击类型三、php相关处理函数1、htmlspecialchars 函数2、htmlentities 函数3、strip_tags 函数一、什么是xss攻击 xss攻击通常指的是通过利用网页开发时留下的漏洞&#xff0c;通过巧妙的方法注入恶意指令代码到网页&#xff0c;使用户加载并执…

make menuconfig分析

在uboot源码顶层目录下&#xff0c;进入scripts/kconfig目录&#xff0c;打开Makefile文件 mconf作为可执行参数,uboot源码顶层目录下的配置文件传递给conf

39_tp6的rce漏洞

tp6的rce漏洞 一、环境搭建 使用docker本地搭建tp6环境 1. 下载镜像 docker pull vulfocus/thinkphp:6.0.122. 端口映射 启动镜像,并将80端口映射到8081端口,防止80端口冲突,运行容器 docker run -it -d -p 8081:80 1fc5d159922e3. 打开网站 默认的网页目录是在public目…

怎么在线识别图片文字?说一个思路

图片中的文字怎么在线识别&#xff1f;很多小伙伴在接收到图片类型的文件时&#xff0c;不知道怎么处理其中记录的信息。打字整理嫌麻烦怕出错的话&#xff0c;可以借助识别软件来处理&#xff0c;下面给大家介绍三种比较好用的工具&#xff0c;希望能解决你的问题。方法一、在…

SAP ADM100-Unit3 系统配置介绍:如何设置配置文件参数

本节将介绍如何改变配置文件参数的值。 1、管理并维护配置文件 如果想去调整配置文件参数,可以使用操作系统特定的编辑器去调整参数。但是,这个过程是有确定风险的,因此用户必须确保这个调整被正确的执行和记录。设置的参数不正确可能导致实例无法启动。因此,SAP系统提供…

JVM学习疑问之——逃逸分析

前言 根据之前安排的jvm学习计划在进行jvm学习&#xff0c;找到了尚硅谷宋红康老师的jvm视频&#xff0c;跟着视频学习、做笔记&#xff0c;学习到了很多&#xff0c;为尚硅谷及宋红康老师点赞。说到这里&#xff0c;虽然我有一键三连&#xff0c;但这么好的视频&#xff0c;我…