【lesson16】进程控制之进程替换(1)

文章目录

  • 进程替换是什么?
  • 进程替换怎么用?
    • 不创建子进程时使用

进程替换是什么?

我们知道fork()之后,父子进程各自执行父进程的一部分代码,如果子进程就想执行一个全新的程序呢?

以前:父子代码共享,数据写时拷贝各自一份

如果子进程想要有自己的代码呢?
我们可以用进程的程序替换来完成以上功能。

程序替换:是通过特定的接口,找到磁盘上的一个权限程序(代码+数据),把它加载到调用进程的物理内存中。
原理:
在这里插入图片描述
所以想进行程序替换我们只要将新的磁盘上的程序加载到内存,并和当前的进程页表重新建立映射关系即可

用fork创建子进程后执行的是和父进程相同的程序(但有可能执行不同的代码分支),子进程往往要调用一种exec函数以执行另一个程序。当进程调用一种exec函数时,该进程的用户空间代码和数据完全被新程序替换,从新程序的启动例程开始执行。调用exec并不创建新进程,所以调用exec前后该进程的id并未改变。
在这里插入图片描述
所以进程替换没有创建新的进程,因为OS并没有为该程序创建新的task_struct,用的全部都是之前程序的task_struct。

进程替换怎么用?

不创建子进程时使用

函数介绍:
在这里插入图片描述
可变参数列表:可以传入不定个数个参数。

我们在命令行上怎么执行的在这里就一个一个怎么填。
例如:ls -a -l 就直接填入"ls",‘’-a’',“-l”。
代码演示:
首先要知道ls的路径
在这里插入图片描述

#include <stdio.h>      
#include <unistd.h>      int main()                                   
{                                            printf("当前进程的开始代码\n");            execl("/usr/bin/ls","ls",NULL);    printf("当前进程的结束代码\n");    return 0;                          
} 

运行结果对比
在这里插入图片描述

我们看到确实可以查出来
再多传几个查看一下

#include <stdio.h>      
#include <unistd.h>      int main()      
{      printf("当前进程的开始代码\n");      //execl("/usr/bin/ls","ls",NULL);      execl("/usr/bin/ls","ls","-a","-l",NULL);    printf("当前进程的结束代码\n");      return 0;              
}

运行结果:
在这里插入图片描述
系统自身运行结果:
在这里插入图片描述

这里大家肯会有个一行为什么最后要传一个NULL因为execl函数是可变参数列表,所以我们要传一个NULL来告知它参数已经传递完毕。

这里大家肯会有疑惑为什么系统使用ls时查出来的信息是带颜色的,而自己查出来时并没有。
其实是系统起了别名:
在这里插入图片描述我们知道多传递一个==–color=auto==参数列表即可

#include <stdio.h>    
#include <unistd.h>    int main()    
{    printf("当前进程的开始代码\n");    //execl("/usr/bin/ls","ls",NULL);    execl("/usr/bin/ls","ls","-a","-l","--color=auto",NULL);                                                                                                              printf("当前进程的结束代码\n");    return 0;    
}

在这里插入图片描述

这里我就有一个问题了,我们代码后面不是有printf吗?为什么没有打印呢?
在这里插入图片描述
因为execl是程序替换,调用该函数成之后,会将当前进程的所有代码和数据都进行替换,包括已经执行的代码和未执行的代码。
所以一旦调用成功execl,后续所有代码,全部不会执行!
测试一下如果调用失败,我们后续代码会执行吗?
我们传入一个根本不存在的执行试一下

#include <stdio.h>    
#include <unistd.h>    int main()    
{    printf("当前进程的开始代码\n");    //execl("/usr/bin/ls","ls",NULL);    execl("/usr/bin/lss","lss","-a","-l","--color=auto",NULL);    printf("当前进程的结束代码\n");    return 0;                                                                                                                                                             
}   

在这里插入图片描述
我们这里看到execl函数调用失败之后,确实后续代码成功的输出,并没有被替换。

**execl为什么调用成功了,为什么不用它的返回值呢?**因为根本就不需要,返回值毫无用处,execl调用成功是会把自己都替换掉。

#include <stdio.h>      
#include <unistd.h>                                                           
#include <stdlib.h>      int main()    
{    printf("当前进程的开始代码\n");    //execl("/usr/bin/ls","ls",NULL);    execl("/usr/bin/ls","ls","-a","-l","--color=auto",NULL);                                                                                                              exit(1);                                               printf("当前进程的结束代码\n");                        return 0;                                              
}

在这里插入图片描述
我们可以看到这里的退出码是0,而不是1.

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

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

相关文章

恢复排序后的数组

目录 1. 问题背景2. 解决方案 1. 问题背景 给定一个乱序数组&#xff1a; [7, 8, 1, 5, 3, 4, 2, 0, 9, 6]将其从小到大排序后可以得到&#xff1a; [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]从乱序到有序只需要调用一下 sort 函数&#xff0c;但要从有序恢复至原先的乱序又该如何做呢…

K8S(二)—介绍

K8S的整体结构图 k8s对象 在 Kubernetes 系统中&#xff0c;Kubernetes 对象是持久化的实体。 Kubernetes 使用这些实体去表示整个集群的状态。 具体而言&#xff0c;它们描述了如下信息&#xff1a; 哪些容器化应用正在运行&#xff08;以及在哪些节点上运行&#xff09;可…

Pyqt5 适配windows缩放

写好的程序遇到 windows 不同文本百分比时&#xff0c;控件与窗口大小会出现 大小拥挤各种问题 解决方式 1、在创建窗口时&#xff0c;选择像素创建 2、做好控件像素大小设置 QtCore.QCoreApplication.setAttribute(QtCore.Qt.AA_UseHighDpiPixmaps) app QApplication(sys…

微服务实战系列之ZooKeeper(中)

前言 昨日博主的第一篇ZooKeeper&#xff0c;对它自身具备的能力做了初步介绍。书接上文&#xff0c;马不停蹄&#xff0c;我们继续挖掘它内在的美&#xff0c;充分把握它的核心与脉络。 揭秘ZooKeeper Q&#xff1a;集群一致性协同是如何进行的 我们讲到分布式&#xff0c;…

Renyi散度:Renyi divergence

有关Renyi散度的基本介绍挺多博客已经写了。本文章主要介绍最基础的概念&#xff0c;以及近些年论文中为啥老喜欢引用这个概念。 一.基础概念 Renyi散度主要是描述两个分布之间的关系。对一个离散的概率分布X&#xff0c;其定义域记作&#xff0c;其实就是概率不为零的点的集…

React脚手架搭建

React脚手架 脚手架&#xff1a;可以快速构建项目的基本架构。 脚手架安装命令 可全局安装脚手架 创建项目 来到当前目录下 create-react-app 项目名&#xff08;不要大写字母&#xff09; 运行项目 进到项目里&#xff0c;在项目目录下&#xff0c;执行 npm start &#xff…

Harmonyos系统列表组件和video组件的使用

列表组件和video组件 List组件和Grid组件的使用简介List组件的使用List组件简介使用ForEach渲染列表设置列表项分割线List列表滚动事件监听设置List排列方向 Grid组件的使用Grid组件简介使用ForEach渲染网格布局 video组件使用Video组件的接口表达形式为 List组件和Grid组件的使…

Python3 字符串 ----20231216

Python3 字符串 字符串是 Python 中最常用的数据类型。我们可以使用引号( 或 " )来创建字符串。 创建字符串很简单,只要为变量分配一个值即可。例如: var1 = Hello World! var2 = "Runoob"Python 访问字符串中的值 Python 不支持单字符类型,单字符在 Pyth…

C语言-Makefile

Makefile 什么是make&#xff1f; make 是个命令&#xff0c;是个可执行程序&#xff0c;用来解析 Makefile 文件的命令这个命令存放在 /usr/bin/ 什么是 makefile? makefile 是个文件&#xff0c;这个文件中描述了我们程序的编译规则咱们执行 make 命令的时候&#xff0c; m…

华为数通——路由冗余和备份

注&#xff1a;当一条路由的出接口down时&#xff0c;该路由会自动失效。 要求&#xff1a;数据优先走千兆链路。 R1 [ ]ip route-static 172.16.1.0 24 12.1.1.2 目的地址 掩码 下一条 [ ]ip route-static 172.16.1.0 24 21.1.1.2 preference 50 目的地址 …

OxLint 发布了,Eslint 何去何从?

由于最近的rust在前端领域的崛起&#xff0c;基于rust的前端生态链遭到rust底层重构&#xff0c;最近又爆出OxLint&#xff0c;是一款基于Rust的linter工具Oxlint在国外前端圈引起热烈讨论&#xff0c;很多大佬给出了高度评价&#xff1b;你或许不知道OxLint&#xff0c;相比ES…

MySQL 8.x temp空间不足问题

目录 一、系统环境 二、问题报错 三、问题回顾 四、解决问题 一、系统环境 系统Ubuntu20.04 数据库版本MySQL 8.0.21 二、问题报错 在MySQL上执行一个大的SQL查询报错Error writing file /tmp/MYfd142 (OS errno 28 - No space left on device) Exception in thread …

【深度学习】强化学习(六)基于值函数的学习方法

文章目录 一、强化学习问题1、交互的对象2、强化学习的基本要素3、策略&#xff08;Policy&#xff09;4、马尔可夫决策过程5、强化学习的目标函数6、值函数7、深度强化学习 二、基于值函数的学习方法 一、强化学习问题 强化学习的基本任务是通过智能体与环境的交互学习一个策略…

el-date-picker 选择一个或多个日期

el-date-picker可选择多个日期 type“dates” 加个s即可 <div><span>el-date-picker选择多个日期</span><el-date-pickertype"dates"v-model"dateList"placeholder"选择一个或多个日期"></el-date-picker></di…

js-正则表达式

一、基本规则 1.字面量表示法&#xff1a;正则表达式可以使用字面量形式创建&#xff0c;例如 /pattern/&#xff0c;其中 pattern 是要匹配的模式。 //直接匹配xxx字符 var reg /abc/ 2.构造函数表示法&#xff1a;你也可以使用 RegExp 构造函数来创建一个正则表达式&…

php链接oracle乱码,尝试把一个php的项目转成java,

​ 最近有个新需求&#xff0c;OA上的考勤信息确认&#xff0c;开始的时候搞了个php的版本&#xff0c;莫名其妙的数据库会乱码&#xff08;oracle&#xff09;(等有时间再写一篇php链接oracle数据库&#xff09;折腾了将近一个周&#xff0c;乱码莫名其妙的出现&#xff0c;代…

MyBatis环境的搭建

1.创建 Maven 工程 打开idea新建一个项目File → Project Structure → Project&#xff0c;build system中选择maven &#xff08;1&#xff09;由于 IDEA 中集成了 Maven&#xff0c;所以我们就不需要下载了&#xff0c;直接使用 IDEA 默认的 Maven 进行项目构建。 &#…

【NSX-T】10. 搭建NSX-T环境 —— 使用 BGP 配置 Tier-0 网关

目录 10.1 创建上行链路网段10.2 创建 Tier-0 网关&#xff08;1&#xff09;设置 Interface 信息&#xff08;2&#xff09;设置 BGP添加 BGP 邻居 &#xff08;3&#xff09;设置 BGP 路由重分发设置路由重新分发 10.3 连接 Tier-0 和 Tier-1 网关10.4 使用网络拓扑验证 Tier…

VLAN间的通讯---三层交换

一.三层交换 1.概念 使用三层交换技术实现VLAN间通信 三层交换二层交换 三层转发 2.基于CEF的MLS CEF是一种基于拓补转发的模型 转发信息库&#xff08;FIB&#xff09;临接关系表 转发信息库&#xff08;FIB&#xff09;可以理解为路由表 邻接关系表可以理解为MAC地址表…

Facebook广告系统结构

Facebook广告系统是一个复杂的大型系统&#xff0c;由多个组件和子系统相互配合工作&#xff0c;实现了广告的投放、拍卖、个性化推荐和效果评估等功能。下面小编讲讲Facebook广告系统的结构。 1、广告管理界面 广告管理界面是广告主与Facebook进行交互的入口&#xff0c;广告…