Linux进程替换

news2025/7/11 12:20:23

进程替换

假如操作系统正在执行某一个程序,我们可以利用程序替换函数指定一个新的程序,让操作系统去执行我们新指定的程序。也就是这样一种情形下,我们fork一个进程,如果fork成功,子进程会和父进程执行相同的代码,而我们创建子进程是希望子进程执行指定的操作,这个要实现在本程序复制之后执行其它程序的过程,我们叫做进程替换

要实现进程替换,我们就要使用exec系列函数

execl

execlp

execle

execv

execvp

execve

其中,替换函数都是以exec开头,后面不同的字符例如:l、v、p、e代表不同的使用方法,一般有如下规律:
l(list) : 表示参数采用列表
v(vector) : 参数用数组
p(path) : 有p自动搜索环境变量PATH
e(env) : 表示自己维护环境变量

其中只有exeve为系统调用,剩下的函数都是调用exeve

我们在Linux中用man命令可以查看exec系列函数族

关于execl系列函数,只是从声明来看,参数中是需要路径

而execv系列函数则是不需要路径的

当系统执行单个execl函数,执行一个新的进程时

对应的虚拟地址和物理地址和磁盘对应的关系图如下

理论部分介绍没有办法深刻理解,我们通过对exec系列函数使用进一步理解

 execl

 这个是不添加fork的单一使用的exec的使用

可以看到execl函数的使用是 路径+参数+结尾标记

这个结尾标记的使用是必须的

(char*)NULL

NULL和\0,0的意义相同,但是(char*)的强转的一定不能少的

单单看到这一步是无法理解execl的使用的

我们对这个程序进行编译运行

可以看到这里运行了我们函数中声明的ps -f命令

那么在程序中为什么没用输出 parent voer!!!

这里我们就要和命令就行 对比来说明

如果我们在终端中给一个错误的命令

这里就是在提示我们错误的原因

那么我们如果在刚刚的main程序中也给出错误的参数

那么结果会如何呢 

 

这里我们把参数改成lss

看看编译运行后会有什么不同的结果

 

我们可以看到最下面就是fork运行的结果,那么可以看到给出了错误的结果还运行了execl后面的代码

这里就涉及了execl的底层运行

如果给出的参数正确,那么代码到execl处就会结束

如果给出的参数不正确,才会执行execl下方的代码 

那么这里我们还看到一个新的输出函数  perror

这个其实和之前学习的标准错误类似

这个函数其实也可以用printf代替,但是用perror可以给出错误的结果

在后续的学习中,我们也可以将perror经常运用

然后还有一个点 这是第一次遇见

我们对main函数进行改变

 

 

 我们运行编译之后再分析结果

可以看到我们这里替换的是系统的ls -a命令

我们再执行一下系统的ls -a命令

 

这里看到系统的ls -a对于可执行程序的颜色是不同于我们替换的ls -a的颜色的

那这是怎么回事呢

其实这是ls的底层执行

实际上我们使用系统的命令执行的ls 是 ls --color 

这里其实是命令的参数执行的规则  --后面会解析为一个单次 例如ls --color

-后面会解析为单个命令 例如 ps -ef

 然后我们修改execl的参数

就可以达到和系统一样的效果

 

这样就可以实现和系统一样的效果

当然我们也可以调用我们自己编写的可执行程序

比如这里我们编写一个简单的main程序

 

前提是要编译出可执行程序

 

 

可以看到这里就也可以替换成我们自己编译的main程序

execl和fork结合

我们之前使用的execl都是单独使用

这里我们将execl和fork结合使用

pid=0 说明是子进程

那我们看看这个程序在运行时会有什么问题

 

这里可以看到没有什么问题

我们将程序放到后台运行

 

这里就可以看到

子进程比父进程先结束,产生了僵尸进程现象

不了解僵尸进程可以翻看往期博文

Linux——僵尸进程,文件操作_iccoke的博客-CSDN博客 

那么我们肯定要解决这个僵尸进程问题

我们使用wait子进程等待父进程结束并给出退出码

我们这里并不要求获取子进程的退出码,所以我们只用wait即可

 

 可以看到我们解决了僵尸进程问题

接下来我们可以介绍剩下的几个函数

在execl的基础下理解就容易的多

execlp和execvp

这两个使用就是不用带上路径

然后execl类 和execv类区别就是 execv的参数储存在数组中

而execle和execve都是会加上一个环境变量

用envp数组存储

这里就涉及到信号问题,我们下一节再讨论

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

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

相关文章

基于springboot+vue的社区健康码管理系统(前后端分离)

博主主页:猫头鹰源码 博主简介:Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容:毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目介绍…

Hive数据操纵语言-DML(Load、insert、事务表)

1. Load加载数据 1.1 概述 主要为将数据文件移动到Hive表对应的位置,即复制、移动操作 1.2 语法 1.2.1 filepath 表示待移动数据的路径文件路径支持下面三种形式,要结合LOCAL关键字一起考虑: 相对路径,例如:projec…

音乐播放

在Qt5中使用Qt Multimedia 模块来实现多媒体应用(音视频播放和控制,相机拍照。收音等)。 使用多媒体模块时需要在pro文件中添加: QT multimedia QMediaPlayer(播放音频) 不追求低延迟的话使用QMediaPlaye…

作业练习3:类的继承

作业练习3:类的继承 面向对象程序设计(C) WHUT-CS 2022 Spring 源码传送门 传送门:https://pan.baidu.com/s/11KwE6tQzC_H-31AFgEWtOg?pwd1111 I.作业目的 本次实验主要在于学习使用C类继承机制实现程序功能。C中的举继承机制能够用于表示类之间的…

Crack:wodXMPP ActiveX 即时通讯组件

wodXMPP ActiveX 组件 XMPP组件,Jabber(ICQ MSN AIM Yahoo GTalk)即时通讯组件 wodXMPP 是 XMPP/Jabber(可扩展消息传递和状态协议)协议的客户端组件。它用于创建轻量级的消息传递客户端,并且除了 wodXMPP 之外不需要其他第 3 方要…

第八章《Java高级语法》第10节:注解

注解可以被理解为一种特殊的注释。普通注释是添加到代码中的人类语言,它可以提高程序的可读性。当源程序被编译为字节码之后,普通注释都会被去除掉,因为这些注释对代码的执行没有任何影响。因此,普通注释只能对代码的阅读者起到帮助。而注释则不同,注释可以对编译器和虚拟…

数字验证学习笔记——UVM学习1

一、类库地图 在SV模块中,验证环境整体的构建,是从底层模块的验证组件搭建到通信和激励生成这些元素无论是软件对象的创建、访问、修改、配置,还是组件之间的通信等都是通过用户自定义的方式来实现的。UVM验证方法学作为之前所有方法学的融合…

ubuntu22.04安装教程

1、选择语言 (默认) 2、取消安装更新 (默认) 3、选择键盘语言 (默认) 4、配置ip,可以直接选择dhcp,也可选择配置静态ip (默认) 5、配置代理 跳过不填写 6、设置镜像源 (默认) https://mirrors.aliyun.com/ubuntu/ 7、磁盘配置,默认即可 (默…

Java_接口使用实例

目录 给对象数组排序 按年龄来比较: 按名字来比较: 尝试自己实现一个 sort 方法 给对象数组排序 class Student {public String name;public int age;public int score;public Student(String name, int age, int score) {this.name name;this…

nginx基础篇

nginx基础篇nginx最小配置解析域名解析常用解析多租户解析Nginx虚拟主机域名配置ServerName匹配规则完整匹配通配符匹配通配符结束匹配正则匹配隧道式模型、网关、代理正向代理&反向代理网关隧道式模式反向代理反向代理一台服务器反向代理多台服务器负载均衡策略动静分离UR…

【微服务】SpringCloud断路器Hystrix

目录 一、断路器Hystrix 1、引入断路器 1.1、依赖 1.2、示例 2、传播安全上下文或使用Spring范围 3、健康指标 4、 Hystrix超时和RibbonClient 一、断路器Hystrix 较低级别的服务中的服务故障可能会导致级联故障,直至服务雪崩。在metrics.rollingStats.timeI…

五、Nacos

文章目录一、安装nacos1.压缩包下载地址2.nacos 中修改端口(8848 端口被占用需要修改)3.启动 nacos:二、nacos项目环境配置三、nacos服务分级存储模型四、NacosRule 实现负载均衡五、服务实例的权重设置六、nacos注册中心一、安装nacos 1.压缩包下载地址 https://…

LeetCode HOT 100 —— 33.搜索旋转排序数组

题目 整数数组 nums 按升序排列&#xff0c;数组中的值 互不相同 在传递给函数之前&#xff0c;nums 在预先未知的某个下标 k&#xff08;0 < k < nums.length&#xff09;上进行了 旋转&#xff0c;使数组变为 [nums[k], nums[k1], …, nums[n-1], nums[0], nums[1], ……

Hive之存储和压缩

Hive系列 第十章 存储和压缩 10.1 首先看一下Hadoop中的压缩 10.1.1 基本概念 1、概念 压缩是一种通过特定的算法来减小计算机文件大小的机制。这种机制是一种很方便的发明&#xff0c;尤其是对网络用户&#xff0c;因为它可以减小文件的字节总数&#xff0c;使文件能够通过…

Linux-yum

Linux下的开发工具即配置基本都要自己手动&#xff0c;和Windows一键式安装相比&#xff0c;Linux软件的安装要复杂很多。 centos 7下&#xff0c;基本的安装方式有三种&#xff1a; 1.源码安装——挺常用的&#xff0c;但是复杂&#xff0c;对初学者来说可以忽略。 2.rpm包安…

FFmpeg的makefile逻辑分析

在开始分析之前&#xff0c;讲一个 makefile 的调试技巧&#xff0c;推荐阅读《如何调试MAKEFILE变量》 make -f Makefile -f vars.mk HOSTPROGS这里我对 vars.mk 做了点修改&#xff0c;因为源 vars.mk 没处理特殊字符&#xff0c;直接 echo 会报错。ffmpeg 的 makefile 的变…

改进粒子滤波的无人机三维航迹预测方法附Matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;修心和技术同步精进&#xff0c;matlab项目合作可私信。 &#x1f34e;个人主页&#xff1a;Matlab科研工作室 &#x1f34a;个人信条&#xff1a;格物致知。 更多Matlab仿真内容点击&#x1f447; 智能优化算法 …

某公司常见题刷题笔记

LeetCode搞起来&#xff0c;虽说和实际业务没啥联系&#xff0c;但现在就卷起来了&#xff0c;没办法被迫卷起来。 1&#xff0c;滑动平均值&#xff0c;官网 给定窗口大小size&#xff0c;然后每次增加一个值value放入窗口&#xff0c;求此窗口内的平均值 class MovingAver…

李宏毅:Life Long Learning

Life Long Learing 也是continual Learning&#xff0c;也是incremental learning 目录 Life-Long Learning vs Transfer Learning Evaluation Research Directions Selective Synaptic Plasticity——Regulization Based Additional Neural Resourcr Allocation Memo…

Python简介-Python3及环境配置

Python简介 Python是一种跨平台的计算机程序设计语言。 是一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言。最初被设计用于编写自动化脚本(shell)&#xff0c;随着版本的不断更新和语言新功能的添加&#xff0c;越多被用于独立的、大型项目的开发。 Python语…