进程的替换

news/2025/2/24 14:06:25

目录

execl

execv

execlp

execvpe

​编辑

再认识环境变量:


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

下面来讲解原理:

首先2号文件差不多它,所以进程替换函数不是系统调用,是只是 用户态的 C 库函数,由C语言封装的函数。

我们接着看一下是怎么替换进行运行的。

首先exec作为一个进程被加载到操作系统中,然后覆盖待替换的进程的数据段,然后修改原页表的映射关系,使其指向这个exec的进程,所以不是创建一个新的进程而是替换了而已。

execl

我们看一下这个进程替换函数的结构,首先返回值,调用函数如果成功就直接指向替换的那个进程的内容,如果失败就直接返回-1,所以如果成功是看不到返回值的,这点和exit退出函数有点像,成功就没有返回值了。第一个参数是要替换的可执行程序的路径,第二个参数是一个可变参数,可以填写很多,是表示怎么执行,带什么附加指令,但是要以空结尾,相当于链表将一个一个结点链接起来,然后最后置空。如果要替换的是bin目录之下的ls指令,那arg就是ls+选项,这里可以分开写也可以整合起来写。

可以看到这个execl跑去执行人家ls的代码,这里有人就有个疑问,为什么execl可以找到ls的位置并替换它,这里用的是环境变量PATH找到的。

execl可以替换ls还可以替换某些进程的。

比如我们要替代other进程打印其pid我们就可以使用execl锁定路径。

第一个参数是路径,第二个是要运行的对象和怎么运行的。

execv

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

这个和上面那个差不多,就是将怎么执行全部封装成一个数组再传进去,

这个argv参数和main函数的是一样的,都是由父进程传递的。

main 函数的 argv 是由 操作系统 在程序启动时传递的,具体来说,是 程序启动时的 shell(或父进程)传递的参数。而execv的argv是由命令行传的。

execv的区别和execl在传参形式的区别就好像list和vector的区别。

execlp

这些以p结尾的都可以不带路径传递了,int execlp(const char *file, const char *arg, ...),第一个参数file是传的想替代那个指令或者进程,第二个和execl一样的,运行什么和怎么运行。

咦那以ls为例,不就传了两个“ls”了吗,这里不重复的,第一个ls是程序名,第二个是怎么运行的惯例,execlp是通过环境变量PATH来找到ls的。

execvpe

这个最复杂,第一个参数可以传路径也可以传要执行的程序(可以是可执行文件名,会自动从 PATH 搜索)。第二个参数和前面一样,第三个参数是传递环境变量,可以是自己创建的也可以是系统里面的。execvpe 用来用新的环境变量执行另一个程序替换当前进程,execvpe 主要是 "让当前进程变成另一个程序,并带上新的环境变量"。就是增加或者替换环境变量。

可以看到替换了所有other打印的环境变量,相当于替换了某个进程的环境变量。

那可不可以添加呀,可以的putenv,环境变量的格式是“xxxx=xxxx”,如下:

然后再通过execl替换执行other就可以了,这个putenv也可以写在父进程里面,或者全局。

再认识环境变量:

1。子进程会继承父进程的全部环境变量

2。程序替换不影响命令行参数和环境变量


http://www.niftyadmin.cn/n/5864440.html

相关文章

遗传算法初探

组成要素 编码 分为二进制编码、实数编码和顺序编码 初始种群的产生 分为随机方法、基于反向学习优化的种群产生。 基于反向学习优化的种群其思想是先随机生成一个种群P(N),然后按照反向学习方法生成新的种群OP(N),合并两个种群,得到一个新的种群S(N…

NebulaAI - 企业级 AI Agent 构建平台

NebulaAI 是什么 行云创新的 NebulaAI 是一款专为企业打造的 AI 应用开发平台,旨在通过自然语言交互和云原生技术,帮助企业实现智能化转型。 NebulaAI 核心功能 NebulaAI 的核心功能包括: 自然语言交互:用户可以通过语音或文本…

Ollama API 交互

Ollama 提供了基于 HTTP 的 API,允许开发者通过编程方式与模型进行交互。 本文将详细介绍 Ollama API 的详细使用方法,包括请求格式、响应格式以及示例代码。 1. 启动 Ollama 服务 在使用 API 之前,需要确保 Ollama 服务正在运行。可以通过…

【每日八股】Redis篇(二):数据结构

Redis 数据类型? 主要有 STRING、LIST、ZSET、SET 和 HASH。 STRING String 类型底层的数据结构实现主要是 SDS(简单动态字符串),其主要应用场景包括: 缓存对象:可以用 STRING 缓存整个对象的 JSON&…

CSS中伪类选择器

作用:选中特殊状态的元素 如何理解"伪"?--虚假的,不真实的 如何理解"伪类"?--像类(class),但是不是类,是元素的一种特殊的状态. 一.动态伪类选择器 1. :link 超链接未被访问的状态; 2. :visited 超链接访问过的状态; 3. :hover 鼠标悬停在元素…

ESP32S3:解决RWDT无法触发中断问题,二次开发者怎么才能使用内部RTC看门狗中断RWDT呢?

目录 基于ESP32S3:解决RWDT无法触发中断问题引言解决方案1. 查看报错日志2. 分析报错及一步一步找到解决方法3.小结我的源码基于ESP32S3:解决RWDT无法触发中断问题 引言 在嵌入式系统中,RWDT(看门狗定时器)是确保系统稳定性的重要组件。然而,在某些情况下,RWDT可能无法…

Android 实现 RTMP 推流:快速集成指南

简介 在 Android 设备上实现 RTMP 推流,可以用于直播、远程监控等应用场景。本文将基于 rtmp-rtsp-stream-client-java 库,介绍如何在 Android 端快速集成 RTMP 推流,包括权限管理、相机预览、推流控制等关键步骤。 步骤 1. 配置 Maven 仓库 在 settings.gradle.kts 中添…

利用Ai对生成的测试用例进行用例评审

利用AI对生成的测试用例进行用例评审,可以从用例的完整性、有效性、一致性等多个维度展开,借助自然语言处理、机器学习等技术,提高评审效率和准确性。以下为你详细介绍具体方法: 1. 需求匹配度评审 利用自然语言处理(NLP)技术 步骤:首先将软件需求文档和生成的测试用例…