【Linux】进程的程序替换

前言:

在未进行进程的程序替换时,父子进程的数据是独立的通过页表进行映射进行实现进程数据的独立性,但是父子进程的代码还是共享的,我父进程将子进程进行创建出来不仅仅只会有父子进程只进行执行共享代码的需求,有的时候需要让子进程进行单独的去执行独立的一份代码,此时这种情况下是如何进行设计的呢?通过了解进程的程序替换就可以豁然开朗。

什么是进程的程序替换?

进程程序替换的该概念和原理

进程的程序替换就是让子进程和父进程执行不同的代码,实现父子进程数据和代码的全部独立,父子进程代码的独立性也是通过页表的重新进行映射实现的。代码仅从重新加载到内存中通过页表重新建立映射关系,程序地址替换也完成了代码的写实拷贝。

进程的程序替换是如何进行的?

通过exec系列的函数进行完成的。

exec系列的函数实际上就是将磁盘中的代码和数据进行加载到内存中形成进程。

查看进程替换函数

man 3 exec

进程替换函数的解析


进程替换函数的返回值是只有出现错误时才会返回-1,进行进程替换成功时是没有返回值的。为什么进程替换成功会没有返回值,我们在下面进行解释。

下面都是通过

execl(const char* path, const char*arg, ...)

这里的l是list的意思

参数说明

path是进程替换后想要进行执行新程序的路径,这里可以是绝对路径和相对路径(要进行执行一个新的程序首先需要先进行找到程序,因此需要首先需要进行传路径)

arg是函数的参数列表,... 代表代表参数的可变参数列表,可以根据传入的参数进行自动识别参数的个数,第一个参数一般是程序名,后续通常是这个程序的参数列表,最后以NULL进行结尾。

当子进程通过程序替换函数进行程序替换时,execl函数后面的代码是没有被子进程进行执行的,子进程在执行程序替换时,程序替换函数后面的代码就被替换掉了,被替换掉的包括execl程序替换函数的返回值,这就是为什么进程替换成功后,进程替换函数没有返回值的原因,也是父进程进行进程等待拿到子进程退出码依然是0的原因。

当通过exec系列函数进行进行调用python语言时的文件时,首先需要进行传入python解释器的路径,然后是解释器的名称,接着是文件名,最后还是以NULL进行结尾。

execv(const char* path, const char*argv[ ])

execv函数和execl函数进行对比区别只有程序进行时传递给新程序的参数列表的方式不同,这里‘v’是代表vector的意思,通过数组进行接收传递的参数列表

execlp(const char* file, const char*arg, ...)

这里和execl相比,这里函数名中带来一个p,这里的p是PATH的意思,是环境变量,所以说当新的程序路径放到环境变量中时,不需要进行传地址,只需要进行传环境变量名即可

execvp(const char* file, const char*argv[])

直接通过环境变量的来进行查找解释器的位置

execle(const char* path, const char*arg, ...
                        ...,char* const envp[  ])

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

execve这个函数和上面的函数是不同的,execve 是最基础的 exec 系统调用,它直接向操作系统请求替换当前进程的映像。其他的 exec 函数(如 execl, execp, execvp, execv 等)通常是对 execve 的封装,提供了更加方便、简洁的接口。

模拟实现shell程序外壳程序

框架的设计思路:

首先shell外壳程序是始终不退出的,需要进行一个死循环,然后通过两个数组进行存储我们键盘输入的命令,其中cmd_line用于存储未被打散的整个命令,注意这个cmd_line数组的类型是char类型,用char类型的原因是存储整个命令方便后续gets进行读取,用g_argv数组用于存储打散的字符串。通过memset进行初始化cmd_line数组,通过fgets函数进行在流输入(键盘中)读取完整命令存在于cmd_line数组中,fgets函数读取完整命令时我们通过回车键进行命令的完成也会被读取到,通过将'\n'→'\0'防止空格一行的出现,然后通过strtok函数将cmd_line函数中的完整命令打散放入g_argv中,然后通过fork函数进行创建子进程运用程序替换进行执行操作。

myshell程序外壳的框架(代码的实现)

一些疑惑的解决

为什么要通过创建子进程让子进程通过程序替换进行执行命令,而不是直接通过父进程进行执行命令???

首先这里进行执行命令不都是系统命令,也有可能是我们编写的程序通过编译后形成的可执行程序的运行,回顾一下我们在window系统下,通过IDE进行编写代码时,都经常出现代码跑挂了的情况,如果让父进程直接执行命令,IDE进程就直接挂掉了,给我们的主观感受就是进程闪退了,再比如我们来leetcode进行刷算法题时,当我们的代码写崩了时,leetcode进程也没有崩掉,也就是说我们进行执行OJ 的也是leetcode父进程创建的子进程。

为什么通过cd ..命令时不会进行当前路径的移动??

因为cd是内部命令,执行内部命令的是shell外壳程序本身,也就是父进程执行内部命令,子进程是没有进行进行执行cd 命令的,并且pwd是属于外部命令,通过pwd执行的是子进程的路径,所以说pwd进行执行时路径是未发生变化的。

处理方法:

如何做到支持命令的简写

例如"ls -l"→"ll"

子进程是如何进行继承父进程的环境变量的??

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

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

相关文章

linux网络编程11——线程池

1. 线程池 1.1 池化技术原理 池化技术 当一个资源或对象的创建或者销毁的开销较大时,可以使用池化技术来保持一定数量的创建好的对象以供随时取用,于是就有了池式结构。常见的池式结构包括线程池、内存池和连接池。 池化技术应用的前提条件主要包括三…

计算机网络 (51)鉴别

前言 计算机网络鉴别是信息安全领域中的一项关键技术,主要用于验证用户或信息的真实性,以及确保信息的完整性和来源的可靠性。 一、目的与重要性 鉴别的目的是验明用户或信息的正身,对实体声称的身份进行唯一识别,以便验证其访问请…

SSM宠物论坛设计系统

🍅点赞收藏关注 → 添加文档最下方联系方式咨询本源代码、数据库🍅 本人在Java毕业设计领域有多年的经验,陆续会更新更多优质的Java实战项目希望你能有所收获,少走一些弯路。🍅关注我不迷路🍅 项目视频 宠…

前后端分离的Java快速开发平台

采用SpringBoot3.x、Shiro、MyBatis-Plus、Vue3、TypeScript、Element Plus、Vue Router、Pinia、Axios、Vite框架,开发的一套权限系统,极低门槛,拿来即用。设计之初,就非常注重安全性,为企业系统保驾护航,…

ComfyUI-PromptOptimizer:文生图提示优化节点

ComfyUI-PromptOptimizer 是 ComfyUI 的一个自定义节点,旨在优化文本转图像模型的提示。它将用户输入的提示转换为更详细、更多样化、更生动的描述,使其更适合生成高质量的图像。无需本地模型。 1、功能 提示优化:优化用户输入的提示以生成…

电梯系统的UML文档05

Dispatcher 不控制实际的电梯组件,但它在软件系统中是重要的。每一个电梯有一个ispatcher,主要功能是计算电梯的移动方向、移动目的地以及保持门的打开时间。它和系统中除灯控制器以外的几乎所有控制对象交互。 安全装置也是一个环境对象,它…

【Spring Boot】掌握 Spring 事务:隔离级别与传播机制解读与应用

前言 🌟🌟本期讲解关于spring 事务传播机制介绍~~~ 🌈感兴趣的小伙伴看一看小编主页:GGBondlctrl-CSDN博客 🔥 你的点赞就是小编不断更新的最大动力 🎆那么废话…

go语言zero框架通过chromedp实现网页在线截图的设计与功能实现

在 GoZero 框架中实现网页在线截图的功能,可以通过集成 chromedp 库来控制 Chrome 浏览器进行截图。chromedp 是一个基于 Chrome DevTools 协议的 Go 包,可以用来在 Go 程序中模拟浏览器操作,如页面截图、DOM 操作、表单提交等。 下面是一个…

新星杯-ESP32智能硬件开发--SoC基础

本博文内容导读 1、当前嵌入式系统的发展情况,分析SoC作为物联网开发的重要技术,是未来物联网发展重要方向。 2、介绍SoC系统的组成和系统特点,了解SoC打下SoC基础。 3、介绍基于ESP32的SoC系列开发板,ESP32开发的系统功能进行总…

蓝桥杯备考:堆和priority queue(优先级队列)

堆的定义 heap堆是一种特殊的完全二叉树,对于树中的每个结点,如果该结点的权值大于等于孩子结点的权值,就称它为大根堆,小于等于就叫小根堆,如果是大根堆,每个子树也是符合大根堆的特征的,如果是…

微软官方Windows 10系统ISO镜像文件下载指南

简介 什么是ISO镜像文件 ISO镜像文件是一种特殊的数字文件格式, 精确复制了物理光盘的所有内容和结构 。这种文件通常用于存储完整的操作系统安装程序或其他大型软件包,便于在网络上传输和长期保存。ISO文件的核心优势在于其高度的完整性和可靠性&…

RabbitMQ-消息可靠性以及延迟消息

目录 消息丢失 一、发送者的可靠性 1.1 生产者重试机制 1.2 生产者确认机制 1.3 实现生产者确认 (1)开启生产者确认 (2)定义ReturnCallback (3)定义ConfirmCallback 二、MQ的持久化 2.1 数据持久…

fgets、scanf存字符串应用

题目1 夺旗(英语:Capture the flag,简称 CTF)在计算机安全中是一种活动,当中会将“旗子”秘密地埋藏于有目的的易受攻击的程序或网站。参赛者从其他参赛者或主办方偷去旗子。 非常崇拜探姬的小学妹最近迷上了 CTF&am…

【C语言系列】深入理解指针(1)

前言 总所周知,C语言中指针部分是非常重要的,这一件我们会介绍指针相关的内容,当然后续我还会出大概4篇与指针相关的文章,来深入的讲解C语言指针部分,希望能够帮助到指针部分薄弱或者根本不会的程序员们,后…

力扣面试150 串联所有单词的子串 分组滑动窗口

Problem: 30. 串联所有单词的子串 参考题解 滑动窗口 class Solution {public List<Integer> findSubstring(String s, String[] words) {int n s.length(), m words.length, w words[0].length();// 统计 words 中「每个目标单词」的出现次数Map<String, Integ…

CSS笔记01

黑马程序员视频地址&#xff1a; 前端Web开发HTML5CSS3移动web视频教程https://www.bilibili.com/video/BV1kM4y127Li?vd_source0a2d366696f87e241adc64419bf12cab&spm_id_from333.788.videopod.episodes 目录 引入方式 CSS特性 继承性 层叠性 优先级 Emmet写法 …

django应急物资管理系统

Django应急物资管理系统是一种高效、智能的管理系统&#xff0c;旨在应对自然灾害、事故灾难等突发事件&#xff0c;确保救援物资能够及时、准确地调配到需要的地方。 一、系统背景与意义 在现代社会&#xff0c;各类突发事件频繁发生&#xff0c;对人民生命财产安全构成严重…

管理口令安全和资源(二)

DBMS_METADATA DBMS_METADATA 是 Oracle 数据库中的一个包&#xff0c;它提供了用于管理数据库元数据的工具和过程。元数据是关于数据的数据&#xff0c;它描述了数据库的结构&#xff0c;包括表、视图、索引、存储过程、用户和其他数据库对象的信息。DBMS_METADATA 包允许用户…

安路FPGA开发工具TD:问题解决办法 及 Tips 总结

安路科技&#xff08;Anlogic&#xff09;是一家专注于高性能、低功耗可编程逻辑器件&#xff08;FPGA&#xff09;设计和生产的公司。其提供的开发工具TD&#xff08;TangDynasty&#xff09;是专门为安路FPGA系列产品设计的集成开发环境&#xff08;IDE&#xff09;。以下是对…

Java常用时间类

JDK7的时间类 1&#xff1a;Date类 2&#xff1a;SimpleDateFormat类 3&#xff1a;Calendar类 JDK8的时间类 1&#xff1a;Zoneld类 2&#xff1a;Instant类 3&#xff1a;ZoneDateTime 4&#xff1a;LocalDate 5&#xff1a;LocalTime 6&#xff1a;LocalDateTime …