Linux-进程替换

进程程序替换目的

首先我们要知道,创建子进程的目的是什么?

  • 想让子进程执行父进程代码的一部分
  • 想让子进程执行一个全新的代码

我们之前所写的程序,子进程都是在执行父进程代码的一部分,而要想让子进程执行全新的代码,就需要进行进程程序替换
在这里插入图片描述


了解程序替换

先来看看进程程序替换是什么
在这里插入图片描述
上面这个父进程中fork了一个子进程,然后使用程序替换接口,替换了子进程的程序,父进程等待子进程结束,回收子进程

我们看一下程序替换的结果
在这里插入图片描述
这里我们看到子进程进行程序替换成了ls进程

此时,使用我们自己的程序同样可以实现ls -al的功能,因为子进程执行的就是ls -a -l程序。因为程序替换成功了,所以返回ls程序的退出码,如果替换失败,就会执行exit(1)。

#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/wait.h>int main() {pid_t child_pid;if ((child_pid = fork()) == 0) { // 子进程if (execl("/bin/ls", "ls", "-a", "-l", NULL) == -1) {perror("execl");exit(1);}} else if (child_pid > 0) { // 父进程int status;waitpid(child_pid, &status, 0);if (WIFEXITED(status)) {printf("Child exited with status: %d\n", WEXITSTATUS(status));} else {printf("Child process terminated abnormally.\n");}} else {perror("fork");exit(1);}return 0;
}

程序替换的原理

在这里插入图片描述

在子进程刚创建的时候,子进程和父进程通过页表映射到物理内存中空间是同一块空间,父子进程的代码段,数据段,堆,栈等区域都同一个。
在这里插入图片描述
当子进程中执行exec*()函数的时候,会发生写时拷贝,将原本物理内存中的数据段和代码段拷贝一份,放在新的物理内存中。

将磁盘中要替换的可执行程序覆盖到新的物理内存中,并且改变子进程原本的页表映射关系。

仅程序发生了替换(数据段和代码段),子进程的PCB中的task_struct仍然不变。

而且写时拷贝不仅在数据段发生,在代码段也可以发生,写时拷贝的目的同样是为了保证进程的独立性。程序替换之后,子进程执行的代码也不再是原本父进程中的代码,而是全新的代码,比如上诉例子中的ls程序。


程序替换函数

在这里插入图片描述

第一个参数path表示要执行的程序的路径,第二个参数arg表示要执行的程序的名称,后面的参数是一系列字符串类型的参数,用于指定程序的参数。这里需要注意的是,最后一个参数必须是NULL,表示参数列表的结束。

#include <unistd.h>
#include <stdio.h>int main() 
{if (fork() == 0){ // 子进程execl("/bin/echo", "echo", "Hello", "World!", NULL);} else { // 父进程wait(NULL);}return 0;
}

在这里插入图片描述

第一个参数file表示要执行的程序的文件名(不包括路径),第二个参数arg表示要执行的程序的名称,后面的参数是一系列字符串类型的参数,用于指定程序的参数。最后一个参数必须是NULL,表示参数列表的结束。

#include <unistd.h>
#include <stdio.h>int main() 
{if (fork() == 0) { // 子进程execlp("echo", "echo", "Hello", "World!", NULL);} else { // 父进程wait(NULL);}return 0;
}

注意:
execlp 函数的第一个参数是要执行的可执行程序的路径或名称。具体取决于使用的是相对路径还是绝对路径。

如果可执行程序位于当前工作目录(当前路径)中,你可以直接提供可执行程序的名称作为第一个参数。

如果可执行程序位于其他目录中,可以提供它的绝对路径或相对路径作为第一个参数。

  • 绝对路径:完整的文件系统路径,例如 /home/user/myprogram
  • 相对路径:相对于当前工作目录的路径,例如 ./myprogram../folder/myprogram

在调用 execlp 函数时,操作系统会根据给定的路径或名称去查找可执行程序,并在新的进程中执行它。

需要注意的是,execlp 函数会在系统的 PATH 环境变量定义的路径中查找可执行程序。因此,如果提供的是可执行程序的名称而不是完整路径,操作系统会根据 PATH 环境变量去寻找该程序。


在这里插入图片描述

execle 函数与 execlp 类似,但它需要显式地指定可执行程序的路径,并允许传递环境变量。下面是 execle 函数的参数说明:
path: 可执行程序的路径。可以使用绝对路径或相对路径来指定。例如,/usr/bin/myprogram 或者 ./myprogram。
arg0, arg1, …: 命令行参数,用于传递给可执行程序。常见的约定是将第一个参数作为程序的名称。例如,myprogram。
envp: 带有环境变量的指针数组。环境变量的格式为 name=value。数组最后一个元素必须为 NULL,表示环境变量列表的结束。

#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>int main() {char* args[] = {"echo", "$MY_VAR", NULL};char* env[] = {"MY_VAR=my_value", NULL};execle("/bin/echo", "echo", "$MY_VAR", NULL, env); // 运行 echoprintf("Exec failed\n"); // 如果运行程序失败,这行代码将不会被执行return 0;
}

在上述代码中,我们使用 execle 来运行 echo 命令,并将 $MY_VAR 作为参数传递给它。

同时,我们将一个名为 MY_VAR 的环境变量设为 my_value,使用 env 数组将其传递给 execle。此时,当 echo 命令执行时,它将打印 $MY_VAR,而不是实际的值。但是由于我们提供了 MY_VAR=my_value 的环境变量,因此 echo 命令可以获取到 MY_VAR 的实际值,所以输出将是 my_value。

需要注意的是,execle 会替换当前进程,所以在执行成功之后,程序就不会再执行下面的代码。如果 execle 执行失败,则会继续执行下面的代码,这时我们可以根据自己的需求进行错误处理。


在这里插入图片描述

第二个参数的指针数组,和mian命令函数中的char* argv[]一样,argv[0]是程序名,argv[1]等之后的是选项,最后一个是NULL。

在这里插入图片描述

在这里插入图片描述


在这里插入图片描述
在这里插入图片描述

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

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

相关文章

Mysql 8.0主从复制模式安装(兼容Mysql 5.7)

Mysql V8.0.35安装 官网地址&#xff1a;MySQL :: Download MySQL Community Server 下载【Mysql 8.0.35】压缩包 解压压缩包&#xff0c;仅保留6个安装文件即可 mysql-community-client-8.0.31-1.el7.x86_64.rpm mysql-community-client-plugins-8.0.31-1.el7.x86_64.rpm my…

马斯克震撼演讲:我想创立一个新世界

目录 1拼多多杀入大模型领域&#xff1a;年薪百万招聘人才 2马斯克震撼演讲&#xff1a;我想创立一个新世界 3文心4.0上线首交答卷&#xff1a;百度2023Q3成色如何 1拼多多杀入大模型领域&#xff1a;年薪百万招聘人才 快科技11月22日消息&#xff0c;据国内媒体报道&#x…

Java判断字符串当中是否包含中文内容

代码如下&#xff1a; public static void main(String[] args_) throws Exception {String str1 "zhang张123";String str2 "zhang123";System.out.println(checkStringType(str1)); // 包含中文字符System.out.println(checkStringType(str2)); // 不包…

独立按键去抖动

/*----------------------------------------------- 内容&#xff1a;切换到独立按键模式&#xff0c;通过按键在数码管显示对应的数字 ------------------------------------------------*/ #include<reg52.h> //包含头文件&#xff0c;一般情况不需要改动&#xff0…

Linux C IO复用

IO复用 概述IO模型阻塞式IO非阻塞式IOIO复用select、poll、epoll异同 信号驱动式IO异步IO select函数select示例代码 poll函数poll示例代码 epoll函数创建  epoll_create注册、修改、删除  epoll_ctl轮询 I/O 事件的发生  epoll_waitepoll示例代码 基于TCP和epoll在线多人…

形态学操作—闭运算

闭运算&#xff08;Closing&#xff09;是图像形态学中的一种操作&#xff0c;它结合了膨胀&#xff08;Dilation&#xff09;和腐蚀&#xff08;Erosion&#xff09;操作。闭运算的原理是先对图像执行腐蚀操作&#xff0c;然后再进行膨胀操作。这个过程能够消除图像中的小孔洞…

OpenCV 中Mat.depth()的理解——每个像素的位数——每个像素中每个通道的精度

文章目录 1 图像深度的意义2 depth()与图像显示的映射关系2.1 CV_xS|U|FCx2.2 显示图像转换1 图像深度的意义 depth:深度,即每一个像素的位数(bits),那么我们创建的时候就可以知道根据类型也就可以知道每个像素的位数,也就是知道了创建mat的深度。这个depth() 是我们在定…

赞!优雅的Python多环境管理神器!易上手易操作!

前言 Python 的不同版本之间常常存在依赖关系和兼容性问题&#xff0c;为了方便开发人员在 不同项目中使用不同的版本 。 如果大家使用过Python版本管理工具&#xff0c;肯定大多数人使用的都是Anaconda&#xff0c;它是一个优秀的数据科学开发环境&#xff0c;本身也提供了丰…

通达信吊灯止损指标公式,根据波动幅度自动调整止盈止损

吊灯止损指标是由查克勒博(Chuck LeBeau)发明的&#xff0c;亚历山大埃尔德(Alexander Elder)在其著作《走进我的交易室》中介绍了这种止盈止损方法&#xff08;中文版翻译为倒挂式离场法则&#xff09;&#xff0c;它是根据平均真实波幅ATR设置跟踪止损。吊灯止损指标的目的是…

Redis性能压测、监控工具及优化方案

Redis是一款高性能的开源缓存数据库&#xff0c;但是在实际应用中&#xff0c;我们需要对Redis进行性能压测、监控以及优化&#xff0c;以确保其稳定性和高可用性。本文将介绍Redis性能压测、监控工具及优化方案。 01 Redis性能压测 常用的Redis性能压测工具有&#xff1a; …

909-2015-T3

文章目录 1.原题2.算法思想2.1.求树的高度2.2.求路径 3.关键代码4.完整代码5.输出结果 1.原题 试编写算法&#xff0c;求给定二叉树上从根节点到叶子节点的一条路径长度等于树的深度减一的路径&#xff08;即列出从根节点到该叶子节点的节点序列&#xff09;&#xff0c;若这样…

MQTT.js

MQTT.js mqtt.js简介MQTT测试工具mqttboxMQTTX mqtt使用mqtt引入&#xff08;方式一&#xff09;mqtt引入&#xff08;方式二&#xff09;创建mqtt客户端连接到mqtt代理订阅topic处理接收到的消息重新连接取消订阅发布消息断开连接关闭客户端MQTT APIMQTT在VUE中使用MQTT在Reac…

MySQL数据库常见错误及解决方案

“时记数据安全,共享优质资源”,数据库安全是指数据库数据的完整、真实、可靠和可用性。数据库也是一种软件系统,与其他软件系统一样也需要保护,需要采取一定的技术和一定的安全管理策略,保证数据库中的数据不被泄漏、不被破坏、不被修改或删除。本文列举MySQL数据库常见错…

“index“ should always be multi-word

vue报错&#xff1a;Component name “index” should always be multi-word 分析&#xff1a;组件名要以驼峰格式命名&#xff0c;自定义的要以loginIndex.vue等这种方式命名&#xff0c;防止和html标签冲突&#xff0c;所以命名index.vue 会报错 解决&#xff1a;在.eslint…

性能测试:系统架构性能优化思路

今天谈下业务系统性能问题分析诊断和性能优化方面的内容。这篇文章重点还是谈已经上线的业务系统后续出现性能问题后的问题诊断和优化重点。 系统性能问题分析流程 我们首先来分析下如果一个业务系统上线前没有性能问题&#xff0c;而在上线后出现了比较严重的性能问题&#x…

RTS 客户端-服务器网络

Stone Monarch 从一开始就支持多人游戏&#xff0c;但随着时间的推移&#xff0c;网络模型经历了多次迭代。我最初基于这篇著名的帝国时代文章实现了点对点锁步模型。 点对点锁定步骤有一些众所周知的问题。点对点方面使玩家很难相互连接&#xff0c;并增加了每个新玩家的网络…

uvc_app里面自定义的drm

直接上代码&#xff1a; #include <errno.h> #include <fcntl.h> #include <stdio.h> #include <string.h> #include <sys/mman.h> #include <sys/ioctl.h> #include <unistd.h>#include <libdrm/drm.h> #include <libdrm…

【无标题】dp80采集机和机器人通信相关框架总结

采血机器人通信解析相关框架总结: 类似于dp80,将整个过程进行了分解如下: 类似于dp80,将整个过程进行了分解如下: 上位机界面在进行点击操作的时候,先是通信协议的解析,解析后改变采血的控制状态如下: Dp80主要框架解析࿱

4

【任务 1】容器云平台搭建[5 分] 【题目 1】平台部署–部署容器云平台[1.5 分] 【题目 2】平台部署–部署 Istio 服务网格[0.5 分] 【题目 3】平台部署–部署 KubeVirt 虚拟化[1 分] 【题目 4】平台部署–部署 Harbor 仓库及Helm 包管理工具[1 分] 【题目 5】集群管理–备份 ET…

华为obs上传下载-Java版 2023-11-23

弄了半天&#xff0c;老师帮弄成功了&#xff0c;经过同意&#xff0c;分享到网上&#xff0c;希望能帮助更多人&#xff0c;至于怎么弄的&#xff0c;我也不知道。 创建idea项目后&#xff0c;项目结构&#xff0c;对应文件没有的创一个 pom.xm 注意改Java版本&#xff0c;我…