当前位置: 首页 > news >正文

Linux —— 进程的程序替换[进程控制]

在这里插入图片描述

在这里插入图片描述


🎁个人主页:工藤新一¹

🔍系列专栏:C++面向对象(类和对象篇)

🌟心中的天空之城,终会照亮我前方的路

🎉欢迎大家点赞👍评论📝收藏⭐文章


文章目录

  • 进程的程序替换[进程控制]
    • 一、替换原理
    • 二、替换函数(接口)
      • 2.1 函数解释
      • 2.2命名理解

进程的程序替换[进程控制]

一、替换原理

进程程序替换的核心原理是:保持进程结构不变,只替换进程的内存映像,使得同一个进程可以执行不同的程序代码(允许一个正在运行的进程 完全“变身”为另一个程序

在这里插入图片描述

程序替换,顾名思义,就是将一个进程当前正在运行的程序(代码、数据、堆栈等)全部替换掉,转而执行一个全新的、磁盘上的程序文件。

这个过程的特点是:

  • 并非创建新进程:进程的PID、父进程号、打开的文件描述符表等属性保持不变。它还是原来的那个进程,“壳”没变,但“芯”完全换了。
  • 旧代码被覆盖:当前进程的正文段(代码)、数据段、堆栈段等存储空间会被新程序的相应部分覆盖。
  • 从 main 开始:新程序会从它的 main 函数开始执行。

Linux/Unix 系统中,这一功能是通过 exec 系列函数族(如 execve, execl, execvp 等)来实现的。


在这里插入图片描述

换句话说:一旦替换成功,程序的后半段源代码是不会被执行的


在这里插入图片描述


可以得出结论:exec* 系列的函数,无需做返回值判断,因为只要返回就是失败!

在这里插入图片描述


二、替换函数(接口)

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

在这里插入图片描述


2.1 函数解释

  • 这些函数如果调⽤成功则加载新的程序从启动代码开始执⾏,不再返回。
  • 如果调⽤出错则返回-1
  • 所以exec函数只有出错的返回值⽽没有成功的返回值

2.2命名理解

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

  • l(list) : 表⽰参数采⽤列表
  • v(vector) : 参数⽤数组
  • p(path):有p⾃动搜索环境变量PATH
  • e(env):表⽰⾃⼰维护环境变量

在这里插入图片描述


接口 - execl();

在这里插入图片描述


在这里插入图片描述


加载器:

在这里插入图片描述


使用 C程序 调用 C++程序:

一切可转化为进程运行的程序,全都能够被替换

在这里插入图片描述


验证:程序替换不会创建新的进程

在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


在使用上只是传参形式不同

今天是子进程调用 execv();我们知道:每一进程都存在命令行参数(argc, argv),所以我们曾经并不知道我们自己进程的命令行是谁传入的?如何传入的?
答:子进程调用 exec* 时,如果存在命令行参数(argv),就将 argv 通过 execv() 传给进程(“ls”)

所有程序在运行时,都是 bash 的子进程;子进程的命令行参数来源于其父进程通过 exec() 系统调用传的


在这里插入图片描述


在这里插入图片描述


execvpe()现象:替换 进程中历史[argv[] & env[]]列表被子进程列表完全覆盖掉


execvp()现象:新增[不覆盖] 环境变量

在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


putenv();使进程直接获得环境变量:

在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


增量式的添加环境变量:

  • 直接 putenv();
  • (exec e, putenv(), environ);*

自带 ‘e’ 的系统调用会默认替换掉环境参数列表中环境变量

environ - 默认环境变量的起始地址


在这里插入图片描述


进程替换的本质:让进程执行全新的 代码 & 数据[程序]

为什么要做语言级别的封装呢:在做程序替换时,我们要面对各种各样不同的上层替换所需的场景。将这些接口丰富多样起来,未来调用时所有信息的处理会将这些传参统一转化为系统调用 execve();的样子,方便我们使用


在这里插入图片描述


特性描述
是什么一个进程保持其PID不变,将其内存映像完全替换为另一个程序代码的过程。
怎么做通过 exec 系列函数(如 execve) 实现。通常与 fork 结合使用。
为什么需要高效(利用写时复制)、灵活(创建与执行解耦,便于中间设置)、管理方便(维持清晰的进程关系)。
主要用途Shell执行命令、启动应用程序、运行脚本、服务器处理请求、权限控制等。

简单来说,程序替换是操作系统提供的一种“金蝉脱壳”的能力,让一个进程能够华丽转身,去执行一个全新的使命,而无需“重新投胎”(创建新进程)


在这里插入图片描述
🌟 各位看官好我是工藤新一¹呀~

🌈 愿各位心中所想,终有所致!


文章转载自:

http://Qqz08JMw.jrsLj.cn
http://jcFDZQDL.jrsLj.cn
http://A9OCC7zl.jrsLj.cn
http://mXFkqV99.jrsLj.cn
http://bfH2LKrl.jrsLj.cn
http://Hi9QSKbp.jrsLj.cn
http://0NlymMYc.jrsLj.cn
http://vPpcl2UR.jrsLj.cn
http://3JjNYDx4.jrsLj.cn
http://puoCXIh7.jrsLj.cn
http://JWT29WOr.jrsLj.cn
http://zbSAnRMu.jrsLj.cn
http://0Np04uaS.jrsLj.cn
http://Q4V3Jpt1.jrsLj.cn
http://KkOC0N4F.jrsLj.cn
http://45yZRqiL.jrsLj.cn
http://ivcPOoiC.jrsLj.cn
http://oHcHV9ge.jrsLj.cn
http://sII5Hp4Q.jrsLj.cn
http://nGrWkIAj.jrsLj.cn
http://o4bC3Od8.jrsLj.cn
http://CGYa1OXk.jrsLj.cn
http://R9W367iZ.jrsLj.cn
http://RhI9GEia.jrsLj.cn
http://A3SkIxsF.jrsLj.cn
http://k815jLuM.jrsLj.cn
http://MpXfJYke.jrsLj.cn
http://pOsjck4y.jrsLj.cn
http://He6alqgL.jrsLj.cn
http://lxYxgS1l.jrsLj.cn
http://www.dtcms.com/a/384395.html

相关文章:

  • [Linux] 从YT8531SH出发看Linux网络PHY驱动
  • ArcGIS定向影像(2)——非传统影像轻量级解决方案
  • 分享机械键盘MCU解决方案
  • Unity 性能优化 之 编辑器创建资源优化(UGUI | 物理 | 动画)
  • PostgreSQL——分区表
  • Elastic APM 高级特性:分布式追踪与机器学习优化
  • Ubuntu 服务器配置转发网络访问
  • Redis 数据结构源码剖析(SDS、Dict、Skiplist、Quicklist、Ziplist)
  • C#通讯之网络通讯 TCP UDP
  • 响应时间从5ms到0.8ms:威迈斯AI+DSP协同架构的突破与工程实践
  • 《WINDOWS 环境下32位汇编语言程序设计》第16章 WinSock接口和网络编程(2)
  • 算法--插入排序
  • 领码方案|权限即数据:企业系统中的字段级访问控制架构实战(Ver=1.0)
  • 【面试场景题】支付金融系统与普通业务系统的一些技术和架构上的区别
  • 数证杯顺心借JAVA网站重构详细版(服务器取证基础考点+检材+题目+重构视频)
  • 【Unity】【Photon】Fusion2中的玩家输入系统 学习笔记
  • Vue3 + Three.js 实战:自定义 3D 模型加载与交互全流程
  • 【Leetcode hot 100】102.二叉树的层序遍历
  • [Windows] 微软 .Net 运行库离线安装包 | Microsoft .Net Packages AIO_v09.09.25
  • java通过RESTful API实现两个项目之间相互传输数据
  • C++基础(13)——list类的模拟实现
  • C#/.NET/.NET Core技术前沿周刊 | 第 54 期(2025年9.8-9.14)
  • 快速上手 Jenkins
  • 【C++】STL--List使用及其模拟实现
  • Go语言双向链表list.List详解
  • 机器学习-Boosting
  • Jenkins运维之路(Jenkins流水线改造Day02-2-容器项目)
  • 【C++STL】list的详细用法和底层实现
  • Elastic APM 与 Elasticsearch 集成:构建完整可观测性栈
  • 从零搭建MCP Server:Python开发、部署与应用全流程实战