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

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*函数族底层都是使用的它,扩展出来主要是为了支持不同的使用或应用场景的需求。

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

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

相关文章

MAC: 自己制作https的ssl证书(自己签发免费ssl证书)(OPENSSL生成SSL自签证书)

MAC: 自己制作https的ssl证书(自己签发免费ssl证书)(OPENSSL生成SSL自签证书) 前言 现在https大行其道, ssl又是必不可少的环节. 今天就教大家用开源工具openssl自己生成ssl证书的文件和私钥 环境 MAC电脑 openssl工具自行搜索安装 正文 1、终端执行命令 //生成rsa私钥&…

蓝桥杯-单片机基础16——利用定时计数中断进行动态数码管的多窗口显示

综合查阅了网络上目前能找到的所有关于此技能的代码&#xff0c;最终找到了下述方式比较可靠&#xff0c;且可以自定义任意显示的数值。 传统采用延时函数的方式实现动态数码管扫描&#xff0c;在题目变复杂时效果总是会不佳&#xff0c;因此在省赛中有必要尝试采用定时计数器中…

Vue2(十五):replace属性、编程式路由导航、缓存路由组件、路由组件独有钩子、路由守卫、history与hash

一、router-link的replace属性 1、作用&#xff1a;控制路由跳转时操作浏览器历史记录的模式 2、浏览器的历史记录有两种写入方式&#xff1a;分别为push和replace&#xff0c;push是追加历史记录&#xff0c;replace是替换当前记录。路由跳转时候默认为push 3、如何开启repla…

数据仓库发展历史与架构演进

从1990年代Bill Inmon提出数据仓库概念后经过四十多的发展&#xff0c;经历了早期的PC时代、互联网时代、移动互联网时代再到当前的云计算时代&#xff0c;但是数据仓库的构建目标基本没有变化&#xff0c;都是为了支持企业或者用户的决策分析&#xff0c;包括运营报表、企业营…

数据结构DAY5--二叉树的概念

树&#xff1a; 概念&#xff1a; 由n个节点组成的有限集&#xff0c;有一个根节点&#xff1b;其他节点只有一个前驱节点&#xff0c;但可以有多个后继节点。(一对多) 叶子节点&#xff08;终端结点&#xff09;&#xff1a;只有前驱结点没有后继结点 非叶子节点&#xff0…

【新增利息宝】最新更新的自动抢单系统V6源码免授权无后门 利息宝/抢单/接单返利/区块链

【新增利息宝V6】免授权无后门自动抢单系统源码/利息宝/抢单/接单返利/区块链 更新日志&#xff1a; Ⅰ、新增利息宝功能&#xff0c;余额转入理财 Ⅱ、优化抢单体验&#xff0c;显示随机倒计时和提示内容 Ⅲ、新增首页和订单页面UI特效 Ⅳ、修复抢单页面回调不能返回原分…

【opencv】示例-ela.cpp JPEG图像的错误等级分析(ELA) 通过分析图像压缩后的差异来检测图像是否被篡改过...

ela_modified.jpg 原始ela_modified压缩后再解压得到compressed_img 差异图像Ela 这段代码的功能是实现JPEG图像的错误等级分析&#xff08;ELA&#xff09;&#xff0c;通过分析图像压缩后的差异来检测图像是否被篡改过。程序会首先读取一张图片&#xff0c;然后对其应用质量…

算法打卡day31

今日任务&#xff1a; 1&#xff09;435.无重叠区间 2&#xff09;763.划分字母区间 3&#xff09;56.合并区间 435.无重叠区间 题目链接&#xff1a;435. 无重叠区间 - 力扣&#xff08;LeetCode&#xff09; 给定一个区间的集合&#xff0c;找到需要移除区间的最小数量&…

自己动手封装axios通用方法并上传至私有npm仓库:详细步骤与实现指南

文章目录 一、构建方法1、api/request.js2、api/requestHandler.js3、api/index.js 二、测试方法1、api/axios.js2、main.js3、app.vue4、vue.config.js5、index.html 三、打包1、配置package.json2、生成库包3、配置发布信息4、发布 四、使用1、安装2、使用 五、维护1、维护和…

AGI的核心对齐问题:能力泛化和急速左转

在解决人工智能对齐&#xff08;alignment&#xff09;的技术挑战时&#xff0c;一个核心问题是确保人工智能系统的行为与人类价值和期望保持一致。 然而&#xff0c;人工智能系统往往在获取更强大的能力时会比在对齐方面更容易实现泛化。换句话说&#xff0c;尽管我们可能能够…

Git 安装和配置

下载 Git 网址: https://git-scm.com/download 安装 Git 双击安装包, 开始安装. 修改安装路径, 选择非中文无空格路径: 开始安装: 安装成功: 配置 Git 安装完成后, 在任意文件夹内, 右键, 可以显示两个 Git 选项, 就说明安装成功了.

数据结构——线性表(链式存储结构)

语言&#xff1a;C语言软件&#xff1a;Visual Studio 2022笔记书籍&#xff1a;数据结构——用C语言描述如有错误&#xff0c;感谢指正。若有侵权请联系博主 一、线性表的逻辑结构 线性表是n个类型相同的数据元素的有限序列&#xff0c;对n>0&#xff0c;除第一元素无直接…

如何用electron(vue)搜索电脑本地wifi

对于搜索本地 WiFi 网络&#xff0c;可以使用 Electron 结合 Node.js 来编写一个简单的应用程序。 以下是一个基本的示例&#xff0c;它使用 Node.js 的 wifi 模块来搜索并列出附近的 WiFi 网络&#xff1a; 首先&#xff0c;确保你已经安装了 Node.js 和 Electron。 然后&am…

【Qt】:对话框(一)

对话框 一.基本的对话框二.自定义对话框三.通过图形化界面自定义对话框四.关于对话框mode 对话框是GUI程序中不可或缺的组成部分。一些不适合在主窗口实现的功能组件可以设置在对话框中。对话框通常是一个顶层窗口&#xff0c;出现在程序最上层&#xff0c;用于实现短期任务或者…

Learning Feature Sparse Principal Subspace 论文阅读

1 Abstract: 这篇论文提出了新的算法来解决特征稀疏约束的主成分分析问题&#xff08;FSPCA&#xff09;&#xff0c;该问题同时执行特征选择和PCA。现有的FSPCA优化方法需要对数据分布做出假设&#xff0c;并且缺乏全局收敛性的保证。尽管一般的FSPCA问题是NP难问题&#xff…

华为海思数字芯片设计笔试第二套

1.声明 下面的题目作答都是自己认为正确的答案&#xff0c;并非官方答案&#xff0c;如果有不同的意见&#xff0c;可以评论区交流。 这些题目也是笔者从各个地方收集的&#xff0c;感觉有些题目答案并不正确&#xff0c;所以在个别题目会给出自己的见解&#xff0c;欢迎大家讨…

Adobe After Effects 2024 v24.3 macOS 视频合成及特效制作软件 兼容 M1/M2/M3

Adobe After Effects 是一款适用于视频合成及特效制作软件,是制作动态影像设计不可或缺的辅助工具,是视频后期合成处理的专业非线性编辑软件。 macOS 12.0及以上版本可用 应用介绍 Adobe After Effects简称 AE 是一款适用于视频合成及特效制作软件,是制作动态影像设计不可或缺…

防止邮箱发信泄露服务器IP教程

使用QQ邮箱,网易邮箱,189邮箱,新浪邮箱,139邮箱可能会泄露自己的服务器IP。 泄露原理&#xff1a;服务器通过请求登录SMTP邮箱服务器接口&#xff0c;对指定的收件人发送信息。 建议大家使用商业版的邮箱&#xff0c;比如阿里云邮箱发信等 防止邮件发信漏源主要关注的是确保邮件…

智能边缘自动化:HDMI接口钡铼ARM工业电脑实践案例

一款具备HDMI接口的高性能ARM工业计算机应运而生&#xff0c;为实现在工业4.0时代的关键数据实时处理与可视化管理提供了强有力的硬件支撑。这款计算机依托其独特的边缘计算能力&#xff0c;完美解决了工业环境中大规模数据传输至云端的高延迟问题&#xff0c;成功实现了OT&…

内网安全--AS-REP Roasting攻击

AS-REP Roasting是一种对用户账号进行离线爆破的攻击方式。但是该攻击方式利用比较局限&#xff0c;因为其需要用户账户设置“不要求Kerberos预身份验证”选项&#xff0c;而该选项是默认没有勾选上的。Kerberos预身份验证发送在Kerberos身份验证的第一阶段(AS_REQ&AS-REP)…