Linux下的进程控制-进程程序替换

news2024/11/29 20:49:35

这篇主要说一下Linux下的进程控制中最后一部分内容:进程程序替换
在这里插入图片描述

文章目录

  • 1. 进程程序替换
    • 1.1 为什么要进程程序替换
    • 1.2 替换原理
    • 1.3 如何进行程序替换
      • 1.3.1 execl函数
      • 1.3.2 引入子进程的程序替换
      • 1.3.3 execv函数
      • 1.3.4 execlp函数和execvp函数
      • 1.3.5 如何执行其它语言的程序
      • 1.3.6 execle函数
      • 1.3.7 execve函数和execvpe函数

1. 进程程序替换

1.1 为什么要进程程序替换

我们知道:子进程一般执行的是父进程的代码片段。但是如果我们想让创建出来的子进程去执行其它的程序呢?我们就需要进程程序替换!!!

我们一般在服务器设计(Linux编程)的时候,往往需要子进程干两件种类的事:
1.让子进程执行父进程的代码片段(服务器代码)
2.让子进程执行磁盘中一个全新的程序(shell,想让客户端执行对应的程序,通过我们的进程执行其他人写的进程代码等等)。

1.2 替换原理

在这里插入图片描述
这是我们父进程在运行时,把磁盘中可执行程序中的代码和数据加载到内存中。当我们父进程fork后。子进程的PCB和虚拟内存以父进程为模板,代码共享父进程的,数据也以写时拷贝的方式共享。
在这里插入图片描述
此时,在磁盘中有个新的程序,让子进程数据和代码不在和父进程共享。让子进程去执行这个新文件。这样子进程的页表会进行更新指向新的代码段和数据段。
在这里插入图片描述
替换原理:
1.将磁盘中的程序,加载入内存结构。
2.重新建立页表映射,谁执行程序替换,就重新建立谁的映射。
效果:让父子进程彻底分离,并让子进程执行一个全新的程序。在这里也并没有产生新的进程。

1.3 如何进行程序替换

因为我们是从磁盘加载到内存,一个硬件把数据转移到另外一个硬件中,这个工作是由操作系统完成的,所以我们需要一个系统函数来完成。在Linux云服务器上由7个程序替换函数。

1.3.1 execl函数

我们先来看一个最简单的:
在这里插入图片描述
这三个点叫做可变参数:它的作用是按照用户的意愿传入大小或者数量不等的各个参数。

那么,如果我们想执行一个全新的程序,我们需要做几件事情呢
1. 先找到这个程序在哪里?
2. 程序是怎么执行的?是带选项执行,还是不带选项执行?

那么,这个execl函数第一个参数的意思是:就是传入程序的路径,第二个传入的就是你程序是如何来执行的(命令行怎么写,这个参数就怎么填),最后必须是NULL,标识如何执行程序的参数传递完毕

现在我们写一个最简单的例子:
在这里插入图片描述
在这里插入图片描述
在OS中,命令也是一个程序,我们来运行一下:
在这里插入图片描述
我们可以从结果看到:它这里执行了ls -a -l这个命令。我们再来看一个:
在这里插入图片描述
这个不带选项的。我们运行一下:
在这里插入图片描述
它也执行了pwd这个命令。但是大家有没有发现一个问题:它第二个打印没有进行。
原因是:一旦替换成功,是将当前的代码和数据全部替换了所以,后面的printf已经被替换了,该代码已经不存在了。

在这里插入图片描述
那么我们看这个函数的返回值有什么用呢?要不要判断返回值呢
答案是:不需要。因为当替换成功了,就不会有返回值了,它就执行其它的代码了,你的返回值没有任何作用。而失败的时候,必然会继续向后执行,最多通过得到什么原因导致的替换失败!!!

我们可以用一个失败的来运行一下:
在这里插入图片描述
这里我们是没有这个命令的。
在这里插入图片描述

1.3.2 引入子进程的程序替换

看下面的代码:
在这里插入图片描述
运行一下:
在这里插入图片描述
子进程进行程序替换,会不会影响父进程?
答案是:不会的。因为进程的独立性。
那么它是如何做到的呢?
原因是:当程序替换时,我们可以理解为:代码和数据都发生了写时拷贝完成父子的分离

1.3.3 execv函数

在这里插入图片描述
这个函数也是程序替换函数。第一个参数是:程序的路径。第二个参数:如何执行。
它和execv的区别就是它是一个指针数组。execl是一个一个传参数,而这个是把参数放到数组里,然后传这个数组。

举个例子:
在这里插入图片描述
运行结果如下:
在这里插入图片描述

1.3.4 execlp函数和execvp函数

在这里插入图片描述
这里的第一个参数有什么含义呢?它和execl有什么区别呢?
它第一个参数传的是你要执行什么程序,但是execl需要我们写路径,而这个execlp不需要我们写路径,直接写程序名就行了。因为它是默认在PATH下去寻找的

举个例子:
在这里插入图片描述
我们来看一下运行结果:
在这里插入图片描述
那么execvp也是一样的道理,这里就不多说了。
在这里插入图片描述

1.3.5 如何执行其它语言的程序

目前我们执行的都是系统命令,如果要执行自己写的C/C++程序,或者执行其它语言写的程序呢
我们写一个C++的程序:
在这里插入图片描述
我们要形成两个可执行程序,让其中一个可执行程序去执行另外一个可执行程序:
在这里插入图片描述
但是我们来运行一下:
在这里插入图片描述
但是我们只能执行第一个,因为makefile默认执行一个可执行程序。我们需要这样写:
在这里插入图片描述
这样我们就可以一下形成两个可执行程序:
在这里插入图片描述
然后看一下我们写的程序:
在这里插入图片描述
这里用相对路径也可以,只要能找到它就行了:
在这里插入图片描述
然后,我们看一下运行结果:
在这里插入图片描述
成功的用myexec执行了mycmd。

1.3.6 execle函数

在这里插入图片描述
这里的第三个参数是:环境变量的意思。

举个例子:
在这里插入图片描述
这里我们写了一个系统里的环境变量PATH,和一个我们自己写的环境变量MYPATH(系统里没有)。
在这里插入图片描述
这样就是我们自己写了一个环境变量,然后调用这个函数时导入。然后我们看一下运行结果:
在这里插入图片描述
我们看到什么都没有打印,我们把PATH先注释掉:
在这里插入图片描述
然后看运行结果:
在这里插入图片描述
我们看到它把MYPATH打印出来了。原因是:添加环境变量给目标进程,是覆盖式的。
那么我们该如何解决这个问题呢?
在这里插入图片描述
我们这里使用环境变量的指针来传入。
在这里插入图片描述
因为系统里没有MYPATH环境变量,所以我们要export设置一下。
在这里插入图片描述
这样就都能打印出来了。

1.3.7 execve函数和execvpe函数

在这里插入图片描述
那么execvpe我就不多说了,就是把上面的结合起来就行了。
在这里插入图片描述
那么现在就出现一个问题:为什么execve是单独的
原因是:execve是系统接口,而其余6个是对系统接口的封装。这样做的原因就是适配各种应用场景

这些函数原型看起来很容易混,但只要掌握了规律就很好记:
在这里插入图片描述

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

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

相关文章

Flutter自定义对话框返回相关问题汇总

Flutter自定义对话框&#xff0c;禁用系统返回按钮 - WillPopScope 使用WillPopScope即可&#xff0c;重点onWillPop方法: Future<bool> _onWillPop()>new Future.value(false); 由于要弹出dialog&#xff0c;我这里是禁掉返回按钮&#xff0c;当然也可以在这里做一下…

基于SpringBoot的二手商品交易平台

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SpringBoot 前端&#xff1a;Vue、HTML 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#…

3.6.4、随机接入-CSMA/CA协议

无线局域网使用的协议 1、基本概念 对于上述无线局域网为什么 A 和 C 都检测不到对方的无线信号 因为 C 不在 A 的范围内&#xff0c;C 发送无线信号会导致 A 检测不到 C 在发送 对于上述使用广播信道的有线局域网就不会存在这样的问题 总线上某个主机发送的信号&#xff0…

JVM虚拟机字节码执行引擎——类文件和类加载之前必看

文章目录虚拟机字节码执行引擎运行时栈帧结构局部变量表&#xff08;Local Variables&#xff09;操作数栈动态链接&#xff08;Dynamic Linking&#xff09;方法返回地址附加信息方法调用解析分派虚方法和非虚方法普通调用指令&#xff1a;动态调用指令&#xff1a;动态类型语…

SpringBoot SpringBoot 原理篇 2 自定义starter 2.7 开启yml 提示功能

SpringBoot 【黑马程序员SpringBoot2全套视频教程&#xff0c;springboot零基础到项目实战&#xff08;spring boot2完整版&#xff09;】 SpringBoot 原理篇 文章目录SpringBootSpringBoot 原理篇2 自定义starter2.7 开启yml 提示功能2.7.1 问题引入2.7.2 开启yml提示功能2.…

【矩阵论】正规方程——求解

5.2 正规方程 AHAxAHb为Axb的正规方程\begin{aligned} A^HAxA^Hb为Axb的正规方程 \end{aligned} AHAxAHb为Axb的正规方程​ 5.2.1 正规方程必有解 正规方程 AHAxAHbA^HAxA^HbAHAxAHb 必有解 &#xff0c;且特解为 x0Abx_0A^bx0​Ab &#xff0c;使 AHAx0AHbA^HAx_0A^HbAHAx0​…

一文熟悉 Go 的循环结构 —— for 循环

哈喽大家好&#xff0c;我是陈明勇&#xff0c;今天分享的知识是 Go 的循环结构。如果本文对你有帮助&#xff0c;不妨点个赞&#xff0c;如果你是 Go 语言初学者&#xff0c;不妨点个关注&#xff0c;一起成长一起进步&#xff0c;如果本文有错误的地方&#xff0c;欢迎指出&a…

【Spring】——10、@PostConstruct注解和@PreDestroy注解

&#x1f4eb;作者简介&#xff1a;zhz小白 公众号&#xff1a;小白的Java进阶之路 专业技能&#xff1a; 1、Java基础&#xff0c;并精通多线程的开发&#xff0c;熟悉JVM原理 2、熟悉Java基础&#xff0c;并精通多线程的开发&#xff0c;熟悉JVM原理&#xff0c;具备⼀定的线…

OpenStack集群部署——Keystone部署(二)

三、Keyston-认证服务 3.1 Keyston介绍 Keyston介绍 补充 3.2 安装时间同步器 ----------------------------------------------------使用chrony安装------------------------------------------------- ####所有节点 #下载安装chrony yum -y install chrony #修改配置…

【心电信号】Simulink胎儿心电信号提取【含Matlab源码 1550期】

⛄一、心电信号简介 0 引言 心电信号是人类最早研究的生物信号之一, 相比其他生物信号更易于检测, 且具有直观的规律。心电图的准确分析对心脏病的及早治疗有重大的意义。人体是一个复杂精密的系统, 有许多不可抗的外界因素, 得到纯净的心电信号非常困难。可以采用神经网络算法…

MongoDB 分片集群

之前说到了主从集群&#xff0c;关于主从集群的搭建以及细节后面会再次分享&#xff0c;这次我们先初步来看看 分片集群 举个例子 例如我们有几百G甚至更多的数据&#xff0c;可是我们只有单个副本集&#xff0c;数据量这么大&#xff0c;网络 IO &#xff0c;CPU &#xff0c…

《深度学习的数学》chap1 神经网络的思想

《深度学习的数学》chap1 神经网络的思想 文章目录1-1 神经网络和深度学习神经网络用神经网络实现的人工智能“人教导机器”类型的人工智能的问题1-2 神经元工作的数学表示整理神经元的工作神经元工作的数学表示点火条件的图形表示1-3 激活函数&#xff1a;将神经元的工作一般化…

开源项目-排班管理系统,考勤管理系统

哈喽&#xff0c;大家好&#xff0c;今天给大家带来一个开源系统-排版管理系统 ​​​​​​​git上搜索可以FinalScheduler-master可以了解详情 也可以通过csdn下载​​​​​​​ 该系统主要用于人员的排班使用&#xff0c;主要用人员管理&#xff0c;排班管理&#xff0c…

Java-ForkJoinPool(线程池-工作窃取算法)

文章目录概述工作窃取算法工作窃取算法的优缺点使用 ForkJoinPool 进行分叉和合并ForkJoinPool使用RecursiveActionRecursiveTaskFork/Join 案例Demo概述 Fork 就是把一个大任务切分为若干个子任务并行地执行&#xff0c;Join 就是合并这些子任务的执行结果&#xff0c;最后得到…

《精神与爱欲》爱源于母性,且超越性别

《精神与爱欲》爱源于母性&#xff0c;且超越性别 赫尔曼黑塞&#xff08;1877-1962&#xff09;&#xff0c;作家&#xff0c;诗人&#xff0c;画家。1877年生于德国&#xff0c;1924年入籍瑞士。1946年获诺贝尔文学奖。被誉为“德国浪漫派的最后一位骑士”。 文章目录《精神与…

扩展函数和运算符重载

扩展函数和运算符重载 扩展函数 扩展函数表示在不改变某个类的源代码的情况下,仍然可以打开这个类,向该类中添加新的函数为了能够更好的理解扩展函数的功能,先来思考一个问题:给定一个字符串,这个字符串由字母,数字,特殊符号组成,我们想要统计这个字符串当中字母的个数可以这…

第十章 开源许可证

软件是一种著作&#xff0c;天然是拥有版权的。很多人会认为放在 Github 上的就是开源软件&#xff0c;既然放了源代码&#xff0c;我就可以随便使用了。其实版权法规定著作是禁止共享的&#xff0c;也就是说没有许可证的软件等于保留版权。虽然源代码公开了&#xff0c;但并不…

GUI编程--PyQt5--QLabel

文章目录QLabel 文本展示QLabel 图片展示QLCDNumberQProgressBarQErrorMessageQProgressDialogQLabel 文本展示 展示文本、富文本、图片、动画。 # 实例化 label QLabel(self) # 设置文本 label.setText("666") # 设置图片 label.setPixmap(QPixmap) label.resize…

[BUG] runtime network not ready: NetworkReady=false reason:NetworkPluginNotRead

1 背景 执行kubectl get node是发现节点是NotReady状态&#xff0c;接着执行kubectl describe node 节点名 详细查看NotReady状态原因如下&#xff1a; runtime network not ready: NetworkReadyfalse reason:NetworkPluginNotReady message:docker: network plugin is not r…

数据结构之线性表中的双向循环链表【详解】

前言&#xff1a; 嗯&#xff01;昨天我们的无头单向非循环链表咱已经是可以顺利完成出来了的&#xff0c;今天我们就来看一下什么是有头双向循环链表&#xff0c;不要看着这个链表又双向又循环的就比单向不循环链表难&#xff0c;其实这个更加的简单哦&#xff01;前提是你有…