Linux进程程序替换

单进程版程序替换——最简单的程序替换

程序替换(Process Replacement)是Linux/Unix系统中一个重要的概念,指的是一个正在运行的进程完全被另一个程序替换的过程。这是通过exec系列函数实现的。

特点:

1.进程不变性。替换前后进程的PID、优先级、文件描述符等内核数据结构保持不变,仅用户空间的代码和数据被覆盖‌

2.内存空间重构。新程序的代码和数据从磁盘加载到内存,替换原进程的用户空间内容‌。重新建立页表映射,修改虚拟地址与物理内存的对应关系‌。

3.不创建新的进程。与fork()不同,exec不会创建新进程

进程替换原理

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

回想之前的现象,为什么After,I am a process这个打印?这是因为发生程序替换后代码段和数据段发生了改变,execl以后的代码不再存在于代码段,而是被新替换进来的程序代码取代!只有exec函数替换失败,才会执行exec函数后的代码。并且exec函数只有失败返回值,没有成功返回值。

小知识:CPU如何知道新加载进来的程序的入口地址在哪?

Linux中形成的可执行程序是有固定格式的——ELF,可执行程序有程序表头,其可以将各个段(代码段、数据段等)加载到内存,同时该字段存储了程序的入口地址。

接口介绍

第一个参数是用来找到程序,后续的参数是告诉操作系统如何执行这个程序,主要是要不要涵盖选项,要涵盖哪些?

execlp中的p是指的PATH,execlp会在默认的PATH环境变量中寻找。后面参数同上

第一个参数是寻找程序的地址,第二个参数是一个字符串指针数组,替换了可变参数。argv会被传递给相应程序的main函数作为命令行参数。

p是指的PATH,vp会在默认的PATH环境变量中寻找。后面参数同上。

在单进程中,程序替换是将可执行程序的代码和数据加载到内存中,因此exec系列函数承担的是加载器的效果。

l(list) : 表示参数采用列表

v(vector) : 参数用数组

p(path) : 有p自动搜索环境变量PATH

e(env) : 表示自己维护环境变量

多进程版进程替换

如何将父进程自己定义的命令行参数导给子进程?

我们调用execl或者execv将我们设置的命令行参数传递给替换进程。

我们打印一下替换进程的环境变量

函数execv没有传递环境变量!环境变量是什么时候给子进程的?

环境变量也是数据,创建子进程的时候环境变量就已经被子进程继承下去了!但程序替换后环境变量信息照样能打印,这是因为程序替换中环境变量不会被替换。

如果向给子进程传递不同于父进程的环境变量,该如何传递?

1.新增环境变量

第一种,直接在命令行添加新环境变量,这样在其上运行程序都属于其子进程,子进程继承父进程的环境变量,这样程序中间有了我们添加的新环境变量

第二种,不想在命令行添加新环境变量,而是在自己程序中添加并传递给子进程,在父进程中调用putenv()函数

我们在mycode.c中添加新环境变量,并被子进程成功继承,但是命令行却没有该环境变量。

2.彻底替换环境变量

当传递是我们自己定义的环境变量,会覆盖原有的环境变量。此处调用的是系统接口execve而不是库函数,如果想要调用execvpe和execle

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【数据结构与算法】21.合并两个有序链表(LeetCode)

文章目录合并两个有序链表:高效算法解析与实现问题描述核心思路:双指针尾插法完整代码实现关键点解析1. 边界条件处理2. 头节点初始化3. 节点比较与插入4. 剩余节点处理常见错误与修正优化方案:哨兵节点算法应用场景总结总结合并两个有序链表…

gd32modbus从机移植

文章目录1. 背景2. 改写方式2.1 cursor2.2 使用方式3. 移植过程修改概述修改的文件和内容1. PRO2/Core/Inc/usart.h2. PRO2/Core/Src/usart.c3. PRO2/Drivers/BSP/STM32MB/port/portserial.c4. PRO2/Core/Src/stm32f1xx_it.c5. PRO2/Core/Src/main.c6. PRO2/Core/Src/gpio.c引脚…

PCB 控深槽如何破解 5G 基站 120℃高热魔咒?

5G 基站在高频通信下的功耗较 4G 基站提升 3-4 倍,射频模块、电源单元等核心部件的工作温度常突破 120℃,远超设备安全阈值(≤85℃),形成制约通信稳定性的 “高热魔咒”。印制线路板(PCB)作为热…

Linux和shell

最快入门的方式是使用苹果系统。此外,累计补充学习:一、目录结构/bin,二进制文件 /boot,启动文件 /dev,设备文件 /home,主目录,一般外接包、安装包放在这里 /lib,库文件 /opt&#x…

Vue多请求并行处理实战指南

在 Vue 中同时发送多个请求主要通过并行处理机制实现,常用方法包括 Promise.all、axios.all(基于 Axios 库)和 async/await。以下为详细操作指南和注意事项: 一、使用 Promise.all 并行发送请求 Promise.all 接收一个 Promise 数组…

Redis线程模型讨论

很多人常说,因为 Redis 是单线程的,所以它的操作就快、性能就好。但其实这个表述并不完全准确,因为 Redis 作为一个成熟的分布式缓存框架,它由很多模块组成,如网络请求模块、数据操作模块、存储模块、索引模块、高可用…

基于Spring Boot实现中医医学处方管理实践

基于Spring Boot实现中医医学处方管理 以下是基于Spring Boot实现中医医学处方管理的相关示例和资源整理,涵盖基础架构、功能模块及实际应用案例: 基础项目结构 Spring Boot中医处方系统通常采用MVC分层设计: 实体类:定义处方、药材、患者等JPA实体 @Entity public clas…

中宇联:以“智云融合+AI”赋能全栈云MSP服务,深化阿里云生态合作

作为国内领先的全栈云MSP服务商,中宇联依托自主研发的“智云融合AI”服务平台,为企业提供涵盖云架构设计、迁移实施到云优化服务等内容的端到端解决方案,助力客户高效利用云端资源、实现业务创新。一、中宇联云MSP服务能力全景中宇联以混合云…

分布式微服务--万字详解 微服务的各种负载均衡全场景以注意点

前言:1. 使用方式分类总览序号使用形式是否基于服务名调用是否需 LoadBalanced备注1RestTemplate 自定义负载均衡❌ 否(手动拼接URL)❌ 否手动选择服务实例2RestTemplate Ribbon(非服务名)❌ 否(手动拼接…

Netty的Http解码器源码分析

一、HTTP协议简介HTTP(HyperText Transfer Protocol,超文本传输协议)是一种基于 请求-响应模型 的无状态应用层协议,广泛用于客户端(如浏览器)和服务器之间的数据通信。其主要特点包括:基于 TCP…

磁盘io查看命令iostat与网络连接查看命令netstat

1. iostat的使用场景首先iostat命令隶属于sysstat软件包。iostat专门用来查看主机上每个磁盘设备的io情况,包括像每秒的读写数据情况,磁盘平均io时间,设备io繁忙情况等等。1.1 iostat的普通输出解释首先是主机的架构,主机名&#…

Linux ps -ef 命令解析

ps 是 Linux 系统中用于查看进程状态的标准命令,-ef 是其参数组合,用于输出系统范围内所有进程的完整信息。以下是对该参数的详细解析: 1. 核心参数含义-e表示显示所有进程(包括系统进程和用户进程),相当于…