当前位置: 首页 > article >正文

【Linux】:进程程序替换

进程程序替换

  • 一.替换原理
  • 二.替换函数
  • 三.exec类函数

一.替换原理

用fork创建子进程后执行的是和父进程相同的程序(但有可能执行不同的代码分支),子进程往往要调用一种exec函数以执行另一个程序。当进程调用一种exec函数时,该进程的用户空间代码和数据完全被新程序替换,从新程序的启动例程开始执行。调用exec并不创建新进程,所以调用exec前后该进程的id并未改变。

在这里插入图片描述

二.替换函数

在这里插入图片描述

excl是一个可变参数函数,第一个参数是要执行文件的路径,后面代表要执行的命令,最后必须以NULL结尾。

例子

在这里插入图片描述

在这里插入图片描述

我们可以发现ls-a-l这种命令已经执行起来了并且没有执行之后的after打印。excl函数像这种将系统提供指令封装起来,变成进程,这种调用就称之为程序替换。

基本原理

我们知道执行程序时会创建一个子进程,操作系统将该程序的代码和数据加载到物理内存里。当执行到excl函数时,例如上面,它会直接将ls的代码和数据替换掉物理内存里旧的代码和数据,然后重新执行新程序。注意它不会创建新的子进程。

补充

1.excl只有失败返回。因为如果成功,那么后面的代码都会被替换,也就无法处理返回值。
2.Linux中形成的可执行程序是有格式的,ELF,可执行程序的表头。当excl替换后,操作系统就可以通过这个表头找到开始位置。

三.exec类函数

其中有七个以exec开头,统称为excl函数。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

execlp

用法与execl相同,它可以不写(也可以写)绝对路径,只写文件名。它会自动在当前目录下查找。

在这里插入图片描述

execv

它与execl不同的是第二个参数,它的第二个参数是字符串指针类型。其实本质也没区别,不过是把原来可变参数变成了指针数组,例如:ls -a -l分割成三个字符串"ls"“-a”“-l”(最后必须以NULL结尾),将每个字符串的首地址取出做成一个指针数组,再将这个指针数组传入。

在这里插入图片描述

execvp

将上面两种结合即可。
在这里插入图片描述

execle

(新增环境变量)

进程的环境变量会被子进程继承并且不会被替换。如果我们给子进程传递环境变量怎么办呢?当然我们可以直接用export给父进程添加环境变量再继承给子进程。但如果单独给子进程添加就需要使用一个函数。

在这里插入图片描述

使用这个函数可以只给自己定义环境变量而不会影响父进程。

(彻底覆盖)

而这个函数与之前多了一个环境变量参数,它可以接收环境变量。但注意这采用的策略是覆盖,也就是不会继承父进程的环境变量。

在这里插入图片描述

事实上,只有execve是真正的系统调用,其它五个函数最终都调用 execve,所以execve在man手册 第2节,其它函数在man手册第3节。

在这里插入图片描述


http://www.kler.cn/a/108365.html

相关文章:

  • uniapp登录
  • 支持向量机入门指南:从原理到实践
  • 在MySQL 主库上进行自动清理 purged gtid 时,会等待 binlog复制到从库吗
  • vue 基础学习
  • JAVAweb学习日记(三)Ajax
  • 基于ceres优化的3d激光雷达开源算法
  • IP应用场景API的反欺诈潜力:保护在线市场不受欺诈行为侵害
  • 《动手学深度学习 Pytorch版》 10.6 自注意力和位置编码
  • SQL注入原理及思路(mysql)
  • EASYX动画效果实现
  • 【网安AIGC专题10.19】论文6:Java漏洞自动修复+数据集 VJBench+大语言模型、APR技术+代码转换方法+LLM和DL-APR模型的挑战与机会
  • MAYA教程之模型的UV拆分与材质介绍
  • 黑豹程序员-架构师学习路线图-百科:API接口测试工具Postman
  • 8.循环神经网络
  • matlab中字符串转换为数字(str2double函数)
  • 【java爬虫】公司半年报数据展示
  • 明星艺人类的百度百科怎么创建 ?
  • Spring使用注解进行注入
  • 网络综合和简化实频理论学习概述
  • mysql查看数据表文件的存放路径
  • python—openpyxl操作excel详解
  • react中的函数柯里化
  • DWA算法,仿真转为C用于无人机避障
  • CleanMyMac X2024永久免费版mac电脑管家
  • Vue 项目中使用 Pinia 状态管理详细教程
  • 06、SpringCloud -- 订单详情界面实现