Linxu 进程替换

进程替换的背景:

进程的替换我们需要调用execl这个接口,exxecl在3号手册,属于系统接口。

调用系统命令

execl

为了方便理解execl的作用,我们写一个程序:

单进程替换

我们发现运行结果是通过c库里的exec接口把系统命令 "ls"调用起来了,并且是ls带参的 ls-a-l-n形式

也就是  用ls替换了原本的程序。

替换原理

我们的程序跑起来之后就会变成进程,是进程就有PCB,地址空间,页表,物理内存。

同时ls命令也是一个文件,在磁盘当中。

它有代码和数据组成。

我们调用execl,就把ls的代码数据替换了我们原来的代码,数据,完成了进程替换:

多进程替换

 我们让子进程进程ls替换,父进程以阻塞式等待子进程,等待成功把pid打印出来:

观察运行结果发现,子进程仍然没有打印出“进程结束这句话”

另外,父进程等待成功之后打印出来的pid和子进程的pid一样,因此得出结论:子进程没有创建成功。

为什么不创建子进程,因为子进程是父进程的拷贝,共享一块物理地址,子进程如果被替换,父进程也要被替换,为了进程的独立性,父进程不能被替换。

为什么这句话打印不出来呢?

原因:

 证明:

我们故意把execl调用写错,这样调用失败就可以按照源程序走,就可以把源程序的后续显示了:

我们可以把execl的返回值用n接受一下,看一下execl替换失败之后会返回什么:

execl替换失败之后会返回-1:

我们利用这一特性可以这样写:执行替换,替换成功原程序就不会再执行,替换失败原程序就exit退出。

execlp

为什么要写两个ls,第一个ls是我们要替换的文件名,第二个ls是参数的一部分。

execv

写法:

execvp

因为自带path,即系统自己会在环境变量路径下查找,我们直接输要替换的目标文件名):

我们也可以这样:因为argv[0]就是ls这个参数。

上文验证了execl可以把系统文件调用起来替换我们原来文件,那是否可以调用我们自己写的文件来替换呢?

调用c++

写一个mytest.cc文件,让其输出三行hello word:

在test6.cc里面调用mytest.cc:

写一个makefile:

运行结果:

结论:execl不仅可以调用系统文件进行替换,也可以调用我们自己写的程序进行替换。

调用脚本

创建一个test.sh文件,在里面写一段脚本:

用系统解释器bash解释:

输入ll,可以看见t1,t2两个文件已经创建好了:

但是我们发现他们是没有可执行权限的,我们给它加上权限就可以像正常程序一样执行了:

我们在test6.cc文件里调用一下这个脚本文件:

发现就可以用这个脚本替换原来的程序。

调用Python

然后我们在test6.cc里调用

一个程序的创建,执行,结束流程:

首先 创建pcb,地址空间,页表,但是页表此时没有映射,也就进程创建好了,但是还没开始执行代码。

现在要执行代码了,系统再调用exec*类似的接口把代码和数据从磁盘中加载进内存里,然后填入页表,完成映射。

解疑:

全局变量在被编译时磁盘中就有数据了。

因为我们定义全局变量会赋初始值  这个初始值和全局变量会在磁盘.data区域提前预制好,当代码被加载进内存时就加载进去。

局部变量,堆栈上的变量只有被加载时,变为进程时才会有数据,才会形成堆区,栈区

定义的常量字符串,会被编译进可执行程序里的read only这一块区域,在程序被加载内存时会被加载进代码区和全局数据区之间的只读区域。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【深度学习】DAMO-YOLO,阿里,701类通用检测模型,目标检测

https://github.com/tinyvision/DAMO-YOLO/blob/master/README_cn.md DAMO-YOLO是由阿里巴巴达摩院智能计算实验室TinyML团队开发的一个兼顾速度与精度的目标检测框架,其效果超越了目前的一众YOLO系列方法,在实现SOTA的同时,保持了很高的推理速度。DAMO…

Error PostCSS plugin autoprefixer requires PostCSS 8

文章目录 一、情况一二、情况二三、总结 在启动 vue项目时,突然控制台报错: Error: PostCSS plugin autoprefixer requires PostCSS 8。然后依次出现下面几种情况,依次解决完,项目就可以正常启动了 一、情况一 error in ./src/…

【涂鸦T2-U】1、开发环境搭建

前言 本章介绍T2-U的开发环境搭建流程,以及一些遇到的问题。 一、资料 试用网址: 【新品体验】涂鸦 T2-U 开发板免费试用 涂鸦官网文档: 涂鸦 T2-U 开发板 T2-U 模组规格书 T2-U 开发板 淘宝(资料较全): 涂鸦智能 TuyaOS开发…

软件测试职业规划导图

公司开发的产品专业性较强,软件测试人员需要有很强的专业知识,现在软件测试人员发展出现了一种测试管理者不愿意看到的景象: 1、开发技术较强的软件测试人员转向了软件开发(非测试工具开发); 2、业务能力较强的测试人员转向了软件…

基于单片机的肺活量检测系统(论文+源码)

1.系统设计 在基于单片机的肺活量检测系统中,在硬件上整个系统通过利用主控制器STC89C52单片机来实现对整个系统进行控制的功能,通过采用LCD1602实现实时液晶显示数据的功能,通过肺活量传感器XGZP6847ADC0832实现监测肺活量的工作&#xff0…

ESP32网络开发实例-远程Web串口监视器

远程Web串口监视器 文章目录 远程Web串口监视器1、应用介绍2、软件准备3、硬件准备4、代码实现在本文中,我们将构建一个 ESP32 网络服务器,用作远程串行监视器。 基于 Web 的串行监视器的工作方式与通常用于调试目的的 Arduino IDE 串行监视器的工作方式相同。 1、应用介绍 …

系列十六、Spring IOC容器的扩展点

一、概述 Spring IOC容器的扩展点是指在IOC加载的过程中,如何对即将要创建的bean进行扩展。 二、扩展点 2.1、BeanDefinitionRegistryPostProcessor 2.1.1、概述 BeanDefinitionRegistryPostProcessor是bean定义的后置处理器,在BeanDefinition加载后&a…

cesium轨迹线(闪烁轨迹线)

cesium轨迹线(闪烁轨迹线) 下面有源码 实现思路 使用ellipse方法加载圆型,修改polyline中‘material’方法重写glsl来实现当前效果(cesium版本1.109) 示例代码 index.html <!DOCTYPE html> <html lang="en"><head

MyBatis框架_01

Web后端开发_03 MyBatis框架 什么是MyBatis? MyBatis是一款优秀的持久层框架&#xff0c;用于简化JDBC的开发。MyBatis本是 Apache的一个开源项目iBatis&#xff0c;2010年这个项目由apache迁移到了google code&#xff0c;并且改名为MyBatis 。2013年11月迁移到Github。官网…

基于Pytest+Requests+Allure实现接口自动化测试

一、整体结构 框架组成&#xff1a;pytestrequestsallure 设计模式&#xff1a; 关键字驱动 项目结构&#xff1a; 工具层&#xff1a;api_keyword/ 参数层&#xff1a;params/ 用例层&#xff1a;case/ 数据驱动&#xff1a;data_driver/ 数据层&#xff1a;data/ 逻…

crontab计划任务

银河麒麟v10服务器版和桌面版执行周期计划任务分为两类&#xff1a;系统任务调度和用户任务调度。系统任务是由 cron (crond) 这个系统服务来控制的&#xff0c;这个系统服务是默认启动的&#xff0c;通过vim /etc/crontab执行。用户自己设置的计划任务则使用crontab 命令 配置…

SpringMVC系列-7 @CrossOrigin注解与跨域问题

背景 前段时间帮同事分析了一个跨域问题&#xff0c;正好系统分析和整理一下。 1.跨域 理解同源策略是理解跨域的前提。同源策略定义如下&#xff1a; 在同一来源的页面和脚本之间进行数据交互时&#xff0c;浏览器会默认允许操作&#xff0c;而不会造成跨站脚本攻击&#x…

柑橘病害数据集(四类图像分类,没有打yolo标签)

1.文件夹分为训练集和测试集 在这个数据集中&#xff0c;有一类是新鲜柑橘&#xff0c;还有另外三种疾病&#xff0c;溃疡病、黑斑病和绿化病。 2.train文件夹 2.1.blackspot&#xff08;黑斑病&#xff09; 文件夹 206张照片 2.2.canker&#xff08;溃疡病&#xff09; 文…

发布鸿蒙的第一个java应用

1.下载和安装华为自己的app开发软件DevEco Studio HUAWEI DevEco Studio和SDK下载和升级 | HarmonyOS开发者 2.打开IDE新建工程&#xff08;当前用的IDEA 3.1.1 Release&#xff09; 选择第一个&#xff0c;其他的默认只能用(API9)版本&#xff0c;搞了半天才发现8&#xff…

PPT 遇到问题总结(修改页码统计)

PPT常见问题 1. 修改页码自动计数 1. 修改页码自动计数 点击 视图——>幻灯片母版——>下翻找到计数页直接修改——>关闭母版视图

HarmonyOS4.0系列——02、汉化插件、声明式开发范式ArkTS和类web开发范式

编辑器调整 我们在每次退出编辑器后再次打开会直接进入项目文件中&#xff0c;这样在新建项目用起来很是不方便&#xff0c;所以这里跟着设置一下就好 这样下次进入就不会直接跳转到当时的文件项目中&#xff01;&#xff01; 关于汉化 settings → plugins → installe…

时间序列预测实战(十九)魔改Informer模型进行滚动长期预测(科研版本)

论文地址->Informer论文地址PDF点击即可阅读 代码地址-> 论文官方代码地址点击即可跳转下载GIthub链接 个人魔改版本地址-> 文章末尾 一、本文介绍 在之前的文章中我们已经讲过Informer模型了&#xff0c;但是呢官方的预测功能开发的很简陋只能设定固定长度去预测未…

【数据结构实验】查找(二)基于线性探测法的散列表

文章目录 1. 引言2. 实验原理2.1 散列表2.2 线性探测法 3. 实验内容3.1 实验题目&#xff08;一&#xff09;输入要求&#xff08;二&#xff09;输出要求 3.2 算法实现三、实验设计3.3 代码整合 4. 实验结果 1. 引言 本实验将通过C语言实现基于线性探测法的散列表 2. 实验原理…

一、TIDB基础

TIDB整个逻辑架构跟MYSQL类似&#xff0c;如下&#xff1a; TIDB集群&#xff1a;相当于MYSQL的数据库服务器&#xff0c;区别是MYSQL数据库服务器为单进程的&#xff0c;TIDB集群为分布式多进程的。 数据库&#xff1a;同MYSQL数据库&#xff0c;数据库属于集群&#xff0c;…

leetcode刷题日志-15.三数之和

这道题还是有点难度&#xff0c;我能想到的就是三重循环&#xff0c;但是题目限制不能重复&#xff0c;所以这道题三重循环完还要去重&#xff0c;太过于麻烦。看了题解以后&#xff0c;大佬们还是厉害&#xff0c;大概思路是这样子的&#xff1a;先对数组进行排序&#xff0c;…