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

linux---进程程序替换详解

 


提示:以下是本篇文章正文内容,下面案例可供参考

一、程序替换的原理

4420d37a84ed427e82c795e156341a8d.png

我们可以创建子进程通过程序替换,来执行不同的程序。程序替换不会重新创建子进程,我们通过程序替换函数,内核将磁盘中的可执行程序和数据加载到内存,这个加载的过程将该进程的代码和数据替换掉。那内核怎么知道替换的程序位置,因为有程序计数器。那怎么知道要执行程序的开始位置呢,其实可执行程序也是有格式的(ELF),可以找到可执行程序的入口地址。

be36a0bcaa94474f81ab117cdc6b1227.png

(子进程)程序替换后,就不会执行后面的代码了.比如exit(0).

bc83c5854a0142fdb17f89759cb753c9.png

二、程序替换函数

6e042b7ad6644c62b4e313c61510f6a8.png

(1)execl

82682d428c794fe1aa7515c205a9d1b5.png

这个函数参数是个可变参数,可以接收多个参数,最后要以NULL结尾(可以简单理解为压栈结束,其中涉及到函数栈帧的问题)。

第一个参数是程序文件的路径,程序也是个文件,它存储在磁盘中,后面的参数就是执行这个程序需要的参数。

67bf95faec064ea29dc74be717144a2a.png

小技巧:后面的参数,之前怎么在命令行怎么执行命令,就怎么传参。 

(2)execlp05100e8904f0482ab28d8290c752893a.png

p代表path,它会到环境变量中查找程序,l是代表list就是列表。 

b556a4eaa2af4eaea9cd9c8569da130a.png

faf88e83736c4ff1a462fecbb52d8c9b.png

这里我们可能有个疑问,两个ls.其实它们的作用不同的,第一个查找的程序文件是哪个,第二个是作为参数使用。

(3)execvp

d37a14565814423c818d2f3d63e8eabe.png

这个函数就没有可变参数了,p表示它会根据你的文件名,去环境变量path中查找,v就是数组的意思。

第一个参数是可执行程序的文件名,第二个是字符串数组(存储执行程序需要的参数),最后一个元素必须为NULL。

b16d0cf1769845c2a73e1b4dbfe240d2.png c990129cd8d849a0a0ffe233f07fbcb8.png

 (4) execv

d83af3889f144cf68bbbebad98485113.png

这个和 execvp不同的是,这个要我们自己写路径,(它没有p不会到环境变量下找)。

00d9fbbb0aba4f0cbdc0251cf25764a2.png


(5) execle与execvpe

 41dc9483572241a1916f6076c6c72a66.png8dc8b629ec68416b8725147df66857d2.png

 这里的e表示环境变量的意思,可以选择要哪个环境变量表,如果我们不用系统的环境变量,那我们就可以使用这个函数直接覆盖掉原来的环境变量。

验证:先自己建一个环境变量的表argv2,然后程序替换后打印所有的环境变量,我们可以看到环境变量已经被覆盖了,新程序的environ指针也指向了这个新的环境变量表。

655757798e4b4a768ae853cbe5349b1c.png

227de4acc586410ea1952e23a455d827.png

034ac1d988204dc5b8b0b75f731edf87.png

三.系统调用接口---execve

4ff2bf5e93c8490bbec454be86141dbf.png

这个是系统调用接口,以上的都是函数都是对这个系统调用的封装,就是说不管你选择哪种以上的程序替换,最终都会转化为这个系统调用。其实也挺容易理解的,程序替换是涉及到内核的,为了保证安全性,操作系统提供了系统调用,一旦涉及了系统调用,用户态立刻变为了内核态,控制权就交给了操作系统。

总结:

这个替换过程可以是同语言内的替换,也可以是跨语言的替换,比如下面脚本语言

脚本文件

c815066a7e8b498bba08dcf4c8e9e696.png

a1c474d40ba14017af88ec0f8967e887.png

be19760e17a54bd0822a6e892ca3aa44.png

 

 

相关文章:

linux---进程程序替换详解

提示:以下是本篇文章正文内容,下面案例可供参考 一、程序替换的原理 我们可以创建子进程通过程序替换,来执行不同的程序。程序替换不会重新创建子进程,我们通过程序替换函数,内核将磁盘中的可执行程序和数据加载到内存…...

笔试编程-百战成神——Day01

1.数字统计 题目来源:数字统计——牛客网 测试用例 算法原理 根据题目我们知道,首先要输出两个数字确定一个区间,寻找这个区间内数字中所有包含2的个数,比如12包含一个2,22包含两个2,以此类推,所以我们的…...

Qt+toml文件读写

Qttoml 使用 cpptoml 库示例Qt 项目中的代码示例 解释注意事项 在Qt中使用TOML(Tom’s Obvious, Minimal Language)格式的文件,可以通过第三方库来实现,例如 cpptoml。TOML是一种易于阅读和写入的配置文件格式,与JSON…...

浅谈C++之指针

一、基本介绍 在C中,指针是一种复杂的数据类型,它存储了另一个变量的内存地址。通过指针,程序可以直接访问和操作内存,这为编程提供了极大的灵活性和效率,但同时也增加了复杂性和潜在的错误风险。 二、指针的概念 指针…...

在虚幻引擎中实时显示帧率

引擎自带了显示帧率的功能 但是只能在编辑器中显示 , 在游戏发布后就没有了 , 所以我们要自己做一个 创建一个控件蓝图 创建画布和文本 , 修改文本 文本绑定函数 , 点击创建绑定 添加一个名为 FPS 的变量 格式化文本 用大括号把变量包起来 {FPS Int} FPS 然后转到事件图表…...

Apache Iceberg构建高性能数据湖

1. 概述 大数据时代的挑战 随着信息技术和互联网的迅猛发展,我们正处于一个数据爆炸的时代。企业和组织每天都在生成和收集海量的数据,这些数据来自于社交媒体、物联网设备、传感器、交易系统等各种来源。如何高效地存储、管理和分析这些庞大的数据集&…...

【图像压缩与重构】基于标准+改进BP神经网络

课题名称:基于标准改进BP神经网络的图像压缩与重构(带GUI) 代码获取方式(付费): 相关资料: 1. 代码注释 2.BP神经网络原理文档资料 3.图像压缩原理文档资料 程序实例截图: 1. 基于标准BP神经网络的图…...

函数式编程(以Python编程语言为例)介绍

函数式编程(以Python编程语言为例)介绍 何为函数式编程? 函数式编程(Functional Programming),不要误以为就是用函数编程。函数式编程确实涉及使用函数,但它不仅仅是“用函数编程”那么简单。 …...

银河麒麟操作系统中查看动态库函数的方法

银河麒麟操作系统中查看动态库函数的方法 1、查看单个动态库中的函数2、查找特定函数位于哪个动态库中 💖The Begin💖点点关注,收藏不迷路💖 在Linux系统,包括银河麒麟操作系统中,动态库(.so文件…...

开放麒麟openkylin

开源社区: openKylin: openKylin 社区的愿景是:在开源、自愿、平等和协作的基础上,由基础软硬件企业、非营利性组织、社团组织、高等院校、科研机构和个人开发者共同创立的一个开源社区。 下载地址: openKylin开源操作系统 安…...

用Python与OpenCV的实践:实时面部对称性分析

目录 思路分析 整体代码 效果展示 总结 在当今计算机视觉领域,人脸识别和分析技术得到了广泛应用。无论是安全验证、社交媒体应用,还是美学研究,人脸特征的提取和分析都是关键技术之一。在这篇博客中,我们将深入探讨一个有趣的…...

第三十三章 使用派生密钥令牌进行加密和签名 - 使用 DerivedKeyToken _进行加密(一)

文章目录 第三十三章 使用派生密钥令牌进行加密和签名 - 使用 <DerivedKeyToken> 第三十三章 使用派生密钥令牌进行加密和签名 - 使用 进行加密&#xff08;一&#xff09; 如果加密了任何安全标头元素&#xff0c;请将它们添加到 WS-Security 标头元素中。为此&#…...

Structure-Aware Transformer for Graph Representation Learning

Structure-Aware Transformer for Graph Representation Learning&#xff08;ICML22&#xff09; 摘要 Transformer 架构最近在图表示学习中受到越来越多的关注&#xff0c;因为它通过避免严格的结构归纳偏差而仅通过位置编码对图结构进行编码&#xff0c;自然地克服了图神经…...

滚动页面,el-table表头始终置顶

效果如下&#xff1a; 起始状态&#xff1a; 滚动后&#xff1a; 代码地址&#xff1a;代码地址-面包多...

Mac使用gradle编译springboot-2.7.x源码

1 开发环境&#xff1a; JDK8 ideaIU-2024.2.2 gradle-7.6.3 代理网络 2 下载springboot源码 代码仓库网址 git clone -b 2.7.x https://github.com/spring-projects/spring-boot.git3 安装gradle gradle下载网址 https://services.gradle.org/distributions/ 安装此文件指…...

MySQL --索引(下)

文章目录 6.索引操作6.1 创建主键索引6.2 创建唯一索引6.3 创建普通索引6.4 创建全文索引6.5 查询索引6.6 删除索引6.7 索引创建原则6.8 复合索引6.9 索引最左匹配原则6.10 索引覆盖 6.索引操作 6.1 创建主键索引 第一种方式&#xff1a; – 在创建表的时候&#xff0c;直接…...

选择寄宿学校,给自闭症孩子一个温暖的第二家

在寻找适合自闭症孩子成长的道路上&#xff0c;每一个家庭都充满了艰辛与希望。而广州市星贝育园康复中心&#xff0c;以其独特的全托寄宿制教育模式&#xff0c;为这些特殊的孩子提供了一个充满爱与关怀的“第二家”。在这里&#xff0c;孩子们不仅能够得到专业的康复训练&…...

大模型训练:K8s 环境中数千节点存储最佳实践

今天这篇博客来自全栈工程师朱唯唯&#xff0c;她在前不久举办的 KubeCon 中国大会上进行了该主题分享。 Kubernetes 已经成为事实的应用编排标准&#xff0c;越来越多的应用在不断的向云原生靠拢。与此同时&#xff0c;人工智能技术的迅速发展&#xff0c;尤其是大型语言模型&…...

【Linux学习】1-2 新建虚拟机ubuntu环境

1.双击打开VMware软件&#xff0c;点击“创建新的虚拟机”&#xff0c;在弹出的中选择“自定义&#xff08;高级&#xff09;” 2.点击下一步&#xff0c;自动识别ubuntu光盘映像文件&#xff0c;也可以点击“浏览”手动选择&#xff0c;点击下一步 3.设置名称及密码后&#xf…...

ftdi_sio驱动学习笔记 3 - 端口操作

目录 1. ftdi_port_probe 1.1 私有数据结构ftdi_private 1.2 特殊probe处理 1.3 确定FTDI设备类型 1.4 确定最大数据包大小 1.5 设置读取延迟时间 1.6 初始化GPIO 1.6.1 使能GPIO 1.6.2 添加到系统 1.6.2.1 设置GPIO控制器的基本信息 1.6.2.2 设置GPIO控制器的元信息…...

smart-mqtt v1.5.4发布,认证能力大升级

smart-mqtt v1.5.4正式发布&#xff0c;此次版本聚焦企业级连接认证能力升级&#xff0c;推出全新高级认证插件&#xff0c;在高性能底座上补齐企业级接入能力&#xff0c;还公布了获取方式与未来规划。版本核心亮点v1.5.4重点通过advanced-auth-plugin让连接认证更适配企业真实…...

保姆级教程:用PHPStudy+红日靶场复现一次完整的内网渗透(从外网打到域控)

从零构建内网渗透实战&#xff1a;PHPStudy环境下的红日靶场攻防演练 在网络安全领域&#xff0c;内网渗透测试是检验企业防御体系完整性的重要手段。本文将带领读者使用常见的PHPStudy环境搭建红日靶场&#xff0c;通过模拟真实攻击路径&#xff0c;从外网Web渗透逐步深入内网…...

AI辅助开发智能车:让快马平台优化你的图像处理与识别算法

最近在准备智能车竞赛&#xff0c;遇到了一个头疼的问题&#xff1a;摄像头采集的图像受环境光影响太大&#xff0c;导致巡线识别不稳定。特别是在弯道和阴影区域&#xff0c;传统固定阈值的二值化方法完全失效。经过反复尝试&#xff0c;发现用InsCode(快马)平台的AI辅助开发功…...

CodeT5安全使用指南:如何避免代码生成中的潜在风险

CodeT5安全使用指南&#xff1a;如何避免代码生成中的潜在风险 【免费下载链接】CodeT5 Home of CodeT5: Open Code LLMs for Code Understanding and Generation 项目地址: https://gitcode.com/gh_mirrors/co/CodeT5 CodeT5作为一款强大的代码理解与生成AI模型&#x…...

CMake构建类型避坑指南:为什么你的Release模式没有优化?CMAKE_BUILD_TYPE常见问题排查

CMake构建类型避坑指南&#xff1a;为什么你的Release模式没有优化&#xff1f; 在C项目开发中&#xff0c;构建类型的选择直接影响最终生成的可执行文件性能。许多开发者在使用CMake时都遇到过这样的困惑&#xff1a;明明设置了CMAKE_BUILD_TYPERelease&#xff0c;但生成的代…...

rk3576 点亮 LCD(mipi)

rk3576 适配 mipi 屏 瑞芯微 RK3576 是一款面向中高端 AIoT 市场的 SoC,其 MIPI DSI (Display Serial Interface) 接口在性能和灵活性上相比前代(如 RK3399/RK3568)有显著提升,特别是在物理层协议的支持上更加现代化。相比RK3399 RK3568的mipi 接口少了 8lane,但是RK3576…...

Asp.Net MVC杂谈之:—步步打造表单验证框架[重排版](1)

在实际使用中,我们可以考虑多种形式来进行这一验证(注:本文目前只研究服务器端验证的情况),最直接的方式莫过于对每个表单值手动用C#代码进行验证了,比如: if(!Int32.TryParse(Request.Form[“age”], out age)){ xxxx… } If(age < xxx || age > xxx){ xxxx… }…...

PowerBI进阶:除了DATEADD,这3种方法也能玩转同比环比(附场景选择指南)

PowerBI时间智能函数深度对比&#xff1a;突破DATEADD局限的实战指南 当你已经能熟练使用DATEADD计算同比环比&#xff0c;却发现报表加载速度越来越慢&#xff0c;或是遇到非标准财年分析需求时&#xff0c;是时候重新审视PowerBI的时间智能函数工具箱了。本文将带你深入剖析四…...

告别手动点鼠标!用Python脚本批量跑Simulink仿真,效率提升10倍

告别手动点鼠标&#xff01;用Python脚本批量跑Simulink仿真&#xff0c;效率提升10倍 在工程仿真领域&#xff0c;Simulink无疑是建模与分析的利器。但当面对参数扫描、蒙特卡洛分析或设计迭代等需要大量重复仿真的场景时&#xff0c;手动操作不仅效率低下&#xff0c;还容易…...

基于Kubernetes Operator的MySQL InnoDB Cluster自动化部署实践

1. MySQL InnoDB Cluster与Kubernetes Operator基础 MySQL InnoDB Cluster是MySQL官方提供的高可用数据库解决方案&#xff0c;它基于MySQL Group Replication技术构建&#xff0c;能够实现多节点数据同步和自动故障转移。想象一下&#xff0c;这就像是一个由多个数据库实例组…...