第三部分:6---进程程序替换

news2024/11/25 13:26:24

目录

进程替换:

execl函数解析:

多进程替换的本质:

exec系列函数解析:

进程替换不会替换原进程的环境变量:


进程替换:

  • 通过 fork 创建的进程,在最初会执行父进程代码的一部分,这通常包括 fork 之后的代码分支。父进程和子进程在 fork 调用后会继续执行相同的代码,但它们在不同的进程上下文中独立运行。

  • 如果希望 fork 创建的子进程执行与父进程完全不同的代码并处理新的数据,从而不再与父进程有任何关联,则需要进行进程程序替换。这通常是通过 exec 系列函数实现的。

  • 进程程序替换的目的,就是将子进程的当前进程映像替换为一个新的程序映像,使得子进程能够执行与父进程无关的代码,并处理与父进程不同的数据。这一操作使得子进程脱离了父进程的上下文,完全专注于新的任务。

  • 通过进程程序替换,子进程不再延续父进程的执行逻辑,而是加载并运行一个全新的程序。这样,父进程和子进程在逻辑上可以完全独立,适用于需要子进程承担不同任务的场景。

execl函数解析:

int ececl(const char* path,const char * arg, ...);
//const char* path : 一个字符串,表示要执行的程序的路径。可以是绝对路径或相对路径。
//const char * arg : 新程序的名称
// ... 代表可变参数列表,传递给程序的命令行参数。
//要注意写完参数后,结尾要加上一个NULL。

// 调用 execl 函数执行 /bin/ls 程序
execl("/bin/ls", "ls", "-l", "-a", NULL);
  • 如果函数调用成功,没有返回值。

  • 如果函数调用失败,返回-1。

多进程替换的本质:

  • 在多进程环境中,当一个子进程发生进程替换时,该子进程的进程控制块(PCB)、地址空间、页表都会被替换为新的进程的对应内容。进程替换通过加载新程序的代码和数据,使得子进程的执行环境完全变成新进程的环境。

  • 进程替换并不会创建新的子进程,它只是将现有的子进程替换为其他进程。因此,子进程在执行新程序时不再延续父进程的代码和数据,但父子进程之间的关系依然保持不变,进程替换后的子进程仍然是父进程的后代。

  • 通过进程替换,子进程要执行的代码和父进程的代码完全解耦。这种解耦确保了子进程不会覆盖父进程的代码,而是独立运行新程序,避免了对父进程的任何干扰或影响。

  • 如果进程替换成功,原来的子进程在 exec 系列函数之后的语句将不会再被执行,因为子进程的执行环境已被完全替换为新程序。exec 之后的原代码段将被新程序的代码覆盖,根本没有机会再被执行。如果 exec 调用失败,则会返回错误,子进程会继续执行 exec 之后的原代码,这意味着进程替换没有成功。

exec系列函数解析:

execl("/bin/ls", "ls", "-l", "-a", NULL);
execlp("ls", "ls", "-l", "-a", NULL);//不用传程序所在目录,会自己去环境变量path遍历查找。

char* const argv[]={"ls", "-l", "-a" , NULL};
execv("/bin/ls", argv);

char* const argv[]={"ls", "-l", "-a" , NULL};
execvp("ls",argv); //也可以使用下面的写法
execvp(argv[0],argv);
  • 以上接口,都是对execve系统调用的封装,只有execve是系统接口。

进程替换不会替换原进程的环境变量:

  • 子进程会继承父进程的环境变量,这一过程是通过子进程继承父进程的地址空间实现的。环境变量在地址空间中作为一部分数据,被子进程完整复制。

  • 在进程替换之后,虽然子进程的代码和数据被新程序替换,但环境变量不会自动被替换。新进程会继续使用原子进程从父进程那里继承的环境变量表。这意味着替换后的进程仍然保持着原来的环境变量设置。

  • 如果在进程替换时使用 execle,并传递了自定义的环境变量表,那么这个自定义的环境变量表将覆盖原子进程继承自父进程的环境变量表。也就是说,新进程将使用传递给 execle 的环境变量,而不是原来的环境变量。

  • 如果希望同时保留原来继承的环境变量,并添加一些自定义的环境变量,可以使用 putenv 函数在父进程中添加自定义的环境变量。这样,子进程在执行进程替换之前就会继承这些新的环境变量,替换后的进程也能够继续使用这些附加的环境变量。

int main()
{
	char* const myenv[]={"MYVAL1=1111","MYVAL2=1111","MYVAL3=1111"}; //自定义环境变量表
	
    char* env_val="MYVAL4=11111";//创建一个环节变量
    putenv(env_val);//添加到父进程的环境变量表
    
	pid_t id=fork();
	if(id==0) // 子进程
	{
		execle("/bin/ls", "ls","-l", "-a",NULL, myenv); //使用自己的环境变量表覆盖原环境变量表
	}
}

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

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

相关文章

动态规划-最长回文子序列

题目描述 给你一个字符串 s ,找出其中最长的回文子序列,并返回该序列的长度。 子序列定义为:不改变剩余字符顺序的情况下,删除某些字符或者不删除任何字符形成的一个序列。 示例 1: 输入:s "bcbbab…

图书馆上新了!新华书店×度小满推出“开学季悦读计划”公益活动

2024年9月,新学期伊始,度小满携手新华书店启动“开学季悦读计划”公益行动。本次活动以“开学季,图书馆上新书”为主题,向度小满“小满助力计划”公益项目落地过的五个地区共六所小学和初中捐赠3300余本图书,让孩子们开…

李飞飞团队 ReKep:空间智能机器人可整合 GPT-4o;苹果首款 AI 手机 iPhone 16 发布丨RTE 开发者日报

开发者朋友们大家好: 这里是 「RTE 开发者日报」 ,每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE(Real-Time Engagement) 领域内「有话题的 新闻 」、「有态度的 观点 」、「有意思的 数据 」、「有思考的 文…

一款专业编曲软件Guitar Pro 8中文版安装激活图文教程

Guitar Pro 8中文版是一款专业编曲软件,帮助所有的吉他爱好者学习、创作、设计、绘谱,指法、音色,了解各种吉他方面的内容,除了吉他还有其他十种乐器可以使用,节省时间,提高效率,有助于学习如何…

LLM大模型学习:AI Agent综述

AI Agent是什么 将LLM思想链接到一起,自主实现用户设定的任何目标。只需要告诉AutoGPT一个目标,能自主生成执行计划。 吴恩达:“与其争论哪些工作才算是真正的 Agent,不如承认系统可以具有不同程度的 Agentic 特性。” 核心在于…

TCP 为什么是三次握手,而不是两次或四次?(通俗易懂)

TCP 三次握手是为了保证:让客户端和服务器都知道自己和对方的发送和接收都没问题。 换句话说,可以 假设客户端和服务端都维护了四个布尔变量:自己发送,自己接收,对方发送,对方接收。 初始值为 false&#…

ROS第三梯:ROS+C++实现速腾Bag包的解析

解决问题:速腾Bag包利用bag_to_pcd生成的pcd文件字段名称存在问题,多了几个异常的"_",导致强度属性无法在Intensity中显示。 解决方案:利用sensor_msgs库进行数据读取和转换成sensor_msgs::PointCloud格式,再…

避免17个最常见的电子邮件营销错误

我们都曾在电子邮件营销中犯过错。你点击发送,随后那种沉重的感觉袭来。你搞砸了,现在所有人都能看到。就像把信息放入瓶子丢进互联网的浩瀚海洋中,无法收回。 有些电子邮件营销错误显而易见,可能会破坏你投入了大量心血的营销活…

多窗口联系

使用信号和槽实现多个界面的跳转 准备好两个界面 一个界面准备好信号 一个界面准备好槽 连接两个界面的信号和槽 主界面的头文件 #ifndef WIDGET_H #define WIDGET_H#include <QWidget>QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACEclass Wi…

俄罗斯电商没有技巧,OZON换季相关爆品

Top1 加热器 Обогреватель кварцевый напольный ИЖЭКО М 800 вт СВ01 энергосберегающий электрообогреватель 商品id&#xff1a;1352359815 月销量&#xff1a;781 OZON选品分析工具&#…

Xilinx系FPGA学习笔记(六)RAM的IP核学习

系列文章目录 文章目录 系列文章目录块RAM生成 块RAM生成 对于RAM来说&#xff0c;也有两种: 在 Memories & Storage Elements 下&#xff0c;一个是 Distributed Memory Generator&#xff0c;另一个是 BlockMemory Generator&#xff0c;这与ROM是类似的 这里的常规接口…

CSP-CCF★★★201812-2小明放学★★★

目录 一、问题描述 二、解答 &#xff08;1&#xff09;注意&#xff1a; &#xff08;2&#xff09;80分版&#xff1a; &#xff08;3&#xff09;100分版&#xff1a; 三、总结 一、问题描述 二、解答 &#xff08;1&#xff09;注意&#xff1a; 题目的n小于等于10的…

9月10(信息差)

&#x1f30d;华为最便宜小折叠&#xff01;华为nova Flip今晚发布&#xff1a;搭载麒麟8000芯片 从曝光的跑分信息来看&#xff0c;nova Flip将搭载麒麟8000处理器&#xff0c;也就是nova 12 Pro/Ultra的同款&#xff0c;采用8核心的134组合&#xff0c;大核是1颗2.4GHz的Cort…

怎么画实体关系图E-R?用这款在线绘图工具简单又好用!

ER图(Entity-Relationship Diagram&#xff0c;即实体-关系图)是一种用于数据库设计的图形化工具&#xff0c;用于描述现实世界的概念模型。它由Peter Chen于1976年首次提出&#xff0c;现已成为数据库建模和系统分析设计中最常用的工具之一。 ER图通过图形化的方式&#xff0…

Mamba模型学习笔记

笔记来源&#xff1a;bilibili Transformer 的死穴 Transformer 结构的核心是自注意力机制层&#xff0c;无论是 encoder 还是 decoder&#xff0c;序列数据都先经过位置编码后喂给这个模块。 但是自注意力机制的计算范围仅限于窗口内&#xff0c;而无法直接处理窗口外的元素…

支持iPhone 16新品预售,饿了么同步上线专人配送等特色服务

9月10日凌晨&#xff0c;2024年 Apple 秋季新品发布会上正式揭晓iPhone 16新机。9月10日一早&#xff0c;饿了么同步宣布&#xff1a;今年将携手近4000家Apple 授权专营店&#xff0c;支持iPhone 16新品预售及现货的同步开售。新机现货首发当日&#xff0c;饿了么消费者最快半小…

Mysql | 知识 | 事务隔离级别

转账案例缘起 我的钱包&#xff0c;共有 100 元。 今天我心情好&#xff0c;我决定给你的转账99元&#xff0c;最后的结果肯定是我的余额变为 1元&#xff0c;你的余额多了99元。 转账这一动作在程序里会涉及到一系列的操作&#xff0c;假设我向你转账 99元 的过程是有下面这…

哪些原因导致ERP成功率这么低?

哪些原因导致ERP成功率这么低&#xff1f; 有一句名言是“幸福的家庭都是相似的&#xff0c;不幸的家庭却各有各的不幸。”&#xff0c;这句名言应用到企业数字化的实施落地中也是适用的&#xff0c;数字化成功实施的企业也都是相似的&#xff0c;数字化实施失败的企业却有各种…

安卓玩机工具-----适合安卓机型的“搞机工具箱” 功能齐全 玩机推荐

搞机工具箱最新版是一款相当出色的电脑端手机工具箱软件&#xff0c;搞机工具箱正式版功能强劲&#xff0c;可以帮助用户不需要root就能够直接对手机进行调节&#xff0c;方便对手机进行更加全面的掌控&#xff0c;搞机工具箱便捷好用&#xff0c;只需要根据文字提示及自己的需…

开源的 Windows 12 网页体验版!精美的 UI 设计、丰富流畅的动画

大家周二好呀&#xff01;博主今天给小伙伴们分享一款炫酷的 Windows 12 体验版&#xff0c;网页效果拉满&#xff0c;非常值得我们去尝试&#xff01; 如果你对未来的Windows操作系统充满期待&#xff0c;那么这款开源的Windows 12 网页体验版绝对不容错过&#xff01;这不仅…