【Linux的进程篇章 - 进程程序替换】

news2025/6/26 2:23:13

Linux学习笔记---009

  • Linux之进程程序替换理解
    • 1、进程程序替换
      • 1.1、先看代码和现象
      • 1.2、替换的原理
      • 1.3、回顾fork函数的应用
    • 2、使用所有的替换方法,并且认识函数参数的含义
      • 2.1、exec*函数族
      • 2.2、exec替换自定义的程序
    • 3、进程的替换的execve系统调用函数

Linux之进程程序替换理解

前言:
前篇开始进行了解学习Linux的fork函数、进城终止以及进城等待等相关知识内容,接下来学习Linux的进程替换,关于exec*函数族的知识,深入地了解这个强大的开源操作系统。
/知识点汇总/

1、进程程序替换

头文件:
#include <unistd.h>
exec*函数族:(…表示可变参数)
1.int execl(const char* path,const char* arg, …);
2.int execlp(const char* file,const char* arg, …);
3.int execle(const char* path,const char* arg, … ,char* const envp[]);
4.int execv(const char* path,char* const argv[]);
5.int execvp(const char* file,char* const argv[]);
6.int execvpe(const char* file,char* const argv[],char* const envp[]);

1.1、先看代码和现象

#include <unistd.h>  
#include <stdio.h>  
  
int main() {  
    printf("这是原程序的代码\n");  
    execl("/bin/ls", "ls", "-l", (char *)NULL);  
    printf("这行代码不会被执行\n");  
    return 0;  
}

在这里插入图片描述
在这里插入图片描述
根据程序现象可知:
利用exec(新的.exe可执行程序)来替换,当前的进程代码和数据.但是仍然是该进程,只是改变的代码和数据,并不创建新的进程
即:老进程的壳子,执行新程序的内容。 — 进程替换技术

在Linux环境中,execl系列函数(包括execl、execlp、execle、execv、execvp和execvpe)是用来执行新的程序的。这些函数替换当前进程的映像为新的程序文件,并从该程序的main函数开始执行。一旦execl或其他exec函数被调用成功,原程序的剩余代码将不会被执行,因为原程序的内存映像已经被新的程序替换了。
换句话说,execl函数会导致当前进程停止执行,并被新的程序取代。新程序从它的main函数开始执行,并且与原程序没有直接的关联。因此,原程序中execl调用之后的任何代码都不会被执行。

1.2、替换的原理

进程 = 内核数据结构 + 代码和数据(此时在这步执行代码的进程替换,用新的程序覆盖掉,并不创建新的进程)
站在被替换的进程角度:本质就是这个程序被加载到内存了。

怎么加载?

exec函数可理解于Linux上的加载函数。 – 即程序替换
此类exec
函数不关心返回值,因为exec*函数只要替换成功,就不会向后继续执行了;只要继续运行原代码了,一定是替换失败了。

1.3、回顾fork函数的应用

利用fork创建子进程,让子进程自己去替换
测试代码:
在这里插入图片描述
创建子进程,让子进程完成任务:

1.之前知识能,让子进程执行父进程代码的一部分
2.现在的exec技术,让子进程执行一个全新的程序。

2、使用所有的替换方法,并且认识函数参数的含义

2.1、exec*函数族

exec函数族:(…表示可变参数)
1.int execl(const char
path,const char* arg, …);
2.int execlp(const char* file,const char* arg, …);
3.int execle(const char* path,const char* arg, … ,char* const envp[]);
4.int execv(const char* path,char* const argv[]);
5.int execvp(const char* file,char* const argv[]);
6.int execvpe(const char* file,char* const argv[],char* const envp[]);

以int execl(const char path,const char arg, …);为例**

l: list列表
path: 表示参数需要带路径,意思通过路径找到被替换的程序。
argv[]: 可理解为命令行参数的形式。命令列表。
…: 可变参数
p:用户可以不传文件的path,只需要传文件名(file)即可。
e:环境变量
注意
a、如果是自定义的环境变量就是整体替换。
b、本质就是,查找这个程序,系统会自动在环境变量PATH中进行查找。
c、所以只要是可执行程序,即进程,那么都可以被替换。

抽象的理解参数就是:你要执行谁(path),你想要怎么执行(命令行参数argv[])

测试代码

int execv(const char* path,char* const argv[]);
int execlp(const char* file,const char* arg, …);
int execvp(const char* file,char* const argv[]);

在这里插入图片描述

2.2、exec替换自定义的程序

我们都是替换的系统命令,能否替换自定义的程序呢?
可以,任何语言(c++/java/python/shell…)编写的可执行程序都可以。
测试代码
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

测试代码

int execle(const char* path,const char* arg, … ,char* const envp[]);
int execvpe(const char* file,char* const argv[],char* const envp[]);
在这里插入图片描述

小结

所以我们就能实现环境变量的三种使用方法:
1.子进程中自定义环境变量;
2.继承老的环境变量给子进程,通过全局的environ
3.老的环境变量进行修改,如putenv()函数,新增环境变量
int putenv(char* string);

测试代码

int putenv(char* string);
在这里插入图片描述

在这里插入图片描述

3、进程的替换的execve系统调用函数

exec*函数族属于3号手册,不属于2号手册的系统调用.

man 3 exec
在这里插入图片描述

只有一个属于系统调用:execve

int execve(const char* filename,char* const argv[],char* const
envp[]);

扩展的exec*函数族底层都是使用的它,扩展出来主要是为了支持不同的使用或应用场景的需求。

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

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

相关文章

312_C++_QT表格的剪切、拷贝、粘贴,轻量化操作

:拷贝 + 粘贴 :剪切 + 粘贴 void CustomTableWidget::cut() {copy();// 获取所有选定的单元格项QList<QTableWidgetItem*> selectedItemsList

浅述.Net中的Hash算法(顺带对称、非对称算法)

【写在前面】 对称加密算法(只有一个私钥&#xff0c;比如DES【不推荐】、AES)&#xff1b; 非对称加密算法&#xff08;公钥与私钥&#xff0c;比如RSA&#xff09;&#xff1b; Hash算法也称为散列函数算法&#xff0c;任意长度的数据都转换为固定长度的字符串&#xff08…

chromium 协议栈 cronet ios 踩坑案例

1、请求未携带 Accept-Language http header 出现图片加载失败 现象&#xff1a; 访问 https://www.huawei.com/cn/?ic_mediumdirect&ic_sourcesurlent 时出现图片加载失败的问题 预期结果&#xff1a; 原因&#xff1a; 网络库删除了添加 Accept-Language header 的逻…

数学建模-最优包衣厚度终点判别法-二(K-Means聚类)

&#x1f49e;&#x1f49e; 前言 hello hello~ &#xff0c;这里是viperrrrrrr~&#x1f496;&#x1f496; &#xff0c;欢迎大家点赞&#x1f973;&#x1f973;关注&#x1f4a5;&#x1f4a5;收藏&#x1f339;&#x1f339;&#x1f339; &#x1f4a5;个人主页&#xff…

【数据结构】单链表(一)

上一篇【数据结构】顺序表-CSDN博客 我们了解了顺序表&#xff0c;但是呢顺序表涉及到了一些问题&#xff0c;比如&#xff0c;中间/头部的插入/删除&#xff0c;时间复杂度为O(N);增容申请空间、拷贝、释放旧空间会有不小的消耗&#xff1b;增容所浪费的空间... 我们如何去解…

电商技术揭秘十八:电商平台的云计算与大数据应用小结

电商技术揭秘相关系列文章 电商技术揭秘一&#xff1a;电商架构设计与核心技术 电商技术揭秘二&#xff1a;电商平台推荐系统的实现与优化 电商技术揭秘三&#xff1a;电商平台的支付与结算系统 电商技术揭秘四&#xff1a;电商平台的物流管理系统 电商技术揭秘五&#xf…

日志监控思路分享,只监控日志内容,不存储

有一个这样的需求&#xff0c;就是实时监控日志文件的内容&#xff0c;不需要存储&#xff0c;仅当某行日志内容触发某个规则时调用一段业务逻辑就行了。比如用户触发限流规则&#xff0c;就将其封禁并发送钉钉通知到运维群。 看到这个需求首先想到的就是日志采集工具&#xff…

数据可视化的3D问题

三维对象非常流行&#xff0c;但在大多数情况下会对解释图形的准确性和速度产生负面影响。 以下是对涉及 3d 的主要图形类型的回顾&#xff0c;并讨论了它们是否被认为是不好的做法。 1、3D 条形图&#xff1a;不要 这是一个 3d 条形图。 你可能很熟悉这种图形&#xff0c;因为…

Windows上面搭建Flutter Android运行环境

Flutter Android环境搭建 电脑上面安装配置JDK电脑上下载安装Android Studio电脑上面下载配置Flutter Sdk &#xff08;避坑点一&#xff09;下载SDK配置对应的环境变量 到path 电脑上配置Flutter国内镜像运行 flutter doctor命令检测环境是否配置成功创建运行Flutter项目&…

网站HTTP升级成为HTTPS的方法

将网站从HTTP免费升级为HTTPS&#xff0c;您可以按照以下步骤操作&#xff1a; 1. 选择证书颁发机构&#xff08;CA&#xff09;&#xff1a; - 为了免费升级&#xff0c;您可以选择使用JoySSL这样的公益项目。JoySSL提供免费、自动化的SSL/TLS证书颁发服务&#xff0c;适用于各…

拉普拉斯IPO丨用创新科技助力中国光伏产业高质量发展

近年来&#xff0c;在“以科技创新引领现代化产业体系建设”的战略指引下&#xff0c;整个光伏行业持续推动技术迭代与生产力升级&#xff0c;朝着更高光电转化效率、更低成本加速迈进。 在此背景下&#xff0c;一批以技术驱动为第一生产力的光伏厂商们&#xff0c;在自身领域…

Java编程题 | 打印杨辉三角

大家可以关注一下专栏&#xff0c;方便大家需要的时候直接查找&#xff0c;专栏将持续更新~ 题目描述 打印出杨辉三角形&#xff08;要求打印出10行如下图&#xff09; 解题思路 初始化变量&#xff1a;设置一个变量表示行号&#xff0c;从1开始。循环打印杨辉三角形…

DSP笔记9-9. GPIO程序控制LED

GPIO23低电平点亮 周期性改变GPIO23电平&#xff0c;使得LED闪烁 void main(void) { InitSysCtrl(); //初始化系统时钟 InitGpio(); //初始化 GPI0 EALLOW; //允许保护 GpioCtrlRegs.GPAMUX2.bit.GPI0230; //将GP1023设置为GPIO GpioCtrlRegs.GPADIR.bit.GPI0231; //将GP1…

恒创科技:香港服务器CPU核心数如何选?越多越好吗?

​  谈到 CPU“核心”是完成所有处理的组件&#xff0c;程序能否顺利运行的第一因素是你有多少个核心。但由于不同的计算任务占用不同的资源&#xff0c;所以如果您打算简单地创建小型网站或者其他请求处理数据也不高的业务&#xff0c;那么您的基本型号应该包含 1、2 核已经…

康谋分享 | aiSim5 物理相机传感器模型验证方法(一)

摘要&#xff1a; aiSim5可以实时模拟复杂的传感器配置&#xff0c;在多GPU分布式渲支持的支持下&#xff0c;aiSim可以渲染20多个摄像头、10多个雷达和10多个激光雷达在同一环境下运行。aiSim5独有的实时渲染引擎能够满足对物理精确环境和天气模拟的所有要求&#xff0c;具有…

RUKOTA 网络ip对讲系统

RUKOTA 网络ip对讲系统 IP对讲采用TCP/IP技术, 将音频信号以数据包形式在局域网和广域网上进行传送&#xff0c;是一套纯数字传输的免提对讲系统&#xff0c;解决了传统对讲系统存在的传输距离有限、易受干扰等问题。 IP对讲系统结构简捷, 只需将终端接入计算机网络即可构成功…

AcWing---游戏---区间dp

1388. 游戏 - AcWing题库 思路&#xff1a; 两个人比赛&#xff0c;是一道博弈论问题&#xff0c;主要思想就是A-B取到最大值。A是我方得到的分数&#xff0c;B是对方得到的分数。我们设g[i][j]是从第i个数到第j个数&#xff0c;先手-后手取得的最大值&#xff0c;分类讨论&a…

【教学类-50-06】20240410“数一数”4类星号图片制作PDF学具

作品展示&#xff1a; 背景需求&#xff1a; 前文遍历四个文件夹&#xff0c;分别将每个文件夹内的10个图片的左上角加入星号&#xff0c;显示难度系数 【教学类-50-05】20240410“数一数”4类图片添加“难度星号”-CSDN博客文章浏览阅读55次&#xff0c;点赞2次&#xff0c;…

ctfshow--web入门--文件上传--web168--web170

web168 法一免杀脚本 还是检查&#xff0c;准备上传图片马 我写的是<?php eval($_POST[a]);?> 上传之后没反应 那么查一下&#xff0c;原来是发现对eval,system还有$_POST和$_GET进行过滤,$_REQUEST还可以用 那么再写一个马&#xff08;免杀脚本&#xff09; <?…

lovesql 手工sql注入

1.页面 2.万能密码登录成功 我还傻乎乎的以为密码就是flag 但不是 3. 继续注入 判断列数 确定了只有三列 开始尝试联合注入 4.使用联合注入之前先判断显示位 5.之后一步一步的构造&#xff0c;先得到当前数据库名 利用database&#xff08;&#xff09; 再得到库里有哪些表 …