Linux——详解进程替换

转载自 进程转换 仅供学习使用 侵删!

1.概念

进程替换(Process Replacement)是指在操作系统中,一个正在执行的进程被另一个新的进程完全替换的过程。在进程替换发生时,原有进程的代码、数据和资源会被新的进程所取代,新进程开始执行,原有进程的执行状态和上下文信息会被丢弃。

进程替换通常是通过操作系统提供的系统调用来实现的,例如在UNIX和类UNIX系统中,使用exec()系列函数来进行进程替换。这些函数会从指定的可执行文件中加载新的程序代码和数据,替换当前进程的内容,并开始执行新程序。

进程替换的一些常见应用场景包括:

  1. 运行不同的程序:通过进程替换,可以在一个进程中运行不同的程序,从而实现程序的切换和执行流程的改变。这在脚本解释器中常见,例如在Shell中执行命令时,会创建子进程并通过进程替换来执行新的命令。

  2. 重启自身:进程替换还可以用于进程自身的重启。一个进程可以通过替换自身来启动一个新的实例,这在一些守护进程或长期运行的服务中很常见,以实现自我更新或重新加载配置等功能。

  3. 进程间通信:进程替换可以作为进程间通信的一种手段。例如,一个进程可以创建一个新进程,然后通过进程替换将自己替换为另一个进程,从而实现进程间的数据传递或协作。

  4. 进程替换的主要优点是能够灵活地改变进程的执行流程,实现进程间的切换和通信。然而,进程替换也有一些注意事项,例如替换后原有进程的状态和资源会丢失,因此需要谨慎处理相关的资源释放和状态保存。

2.进程替换原理

进程替换前的效果图
当一个进程成功创建一个子进程之后,父子进程的情况如下图所示:
1
这个时候,我们这里先针对代码和数据进行分析,其他内容暂不做考虑,此时父子进程都没有修改代码和数据,因此,父子进程的代码和数据都是指向同一块内容的,也就是代码和数据是共享的,如果其中一方对数据进行修改,则这一方就会进行写时拷贝,如果想要执行不同的代码,则此时就要进行进程程序替换
进程替换之后的效果图:
2

3、为什么要进行进程程序替换?

在学习进程程序替换之前,我们知道当一个父进程创建一个子进程之后,父子进程的代码是共享的,子进程只能执行父进程的代码块,但是现在我们的需求增加了,我们不仅要让子进程能够执行父进程的代码块,也要能够让子进程能够做一些父进程不能做的事情,也就是能够执行一个全新的代码(程序),这样就能实现父子进程做的事情有所差异,大大提高了办事效率,同时也使父子进程的代码彻底分离,维护进程的独立性

4、如何进行进程程序替换?(常见进程程序替换系统调用接口)

在学习使用进程程序替换的相关接口之前我们首先需要明确一点,这个在使用接口的时候需要做什么事情,很明显,最基本的我们首先得知道这个程序在哪里,其次,我们还需要知道怎么执行这个程序,在我们前面学习一些指令的时候,有些指令是可以携带选项的有些指令可以不用携带选项。总结起来就是我们需要知道要执行的程序的路径和怎么执行新程序

execl
查看execl的使用方法

3

  • execl的使用
  • 源代码
    4
  • makefile文件
    5
  • 实验结果

6

  • 上面的实验是没有子进程的,是一个纯单进程的实验,下面将演示一个多进程的例子执行ls指令,而且我们会发现一个现象,我们明明在源代码中写了两条printf函数语句,但是结果只有一条打印出来,原因是,当我们进行程序替换之后,子进程将不再执行原来的父进程的代码块,由进程程序替换的结果我们可以知道,子进程中的代码内容完全被替换成新程序的代码
    execl多进程实验
  • 源代码
    6
  • makefile文件
    7
  • 实验结果
    8
  • 实验分析
    上面的实验思路就是父进程创建一个子进程,然后本来子进程是要执行父进程的代码块和父进程进行代码共享的,但是我们在子进程中调用execl函数接口,因此,在子进程中会进行程序替换
  1. execv函数接口的使用
    查看手册

8
这个函数和上面介绍的execl是类似的,都需要做两件事,第一知道新程序的路径,第二知道怎么执行新程序(是否携带选项进行执行),但是这个函数和上面介绍的函数的区别就是这个函数的第二个参数是一个字符指针数组,上面哪个函数是一个一级字符指针,其实区别就在于,上面那个函数传参传的是字符串列表,这个函数传参传的是字符指针数组
实验演示:
源代码:

9

makefile文件
10

  • 实验结果
    11
    需要注意的是:
    execv函数中使用的是字符指针数组,而不是传字符串列表
    数组中的字符串是常量字符串,也就是const char类型的,而这个字符指针数组中存放的又是char的,是支持修改的,因此这里需要将const char强转为char类型

12

execlp函数接口的使用
查看手册
13

execlp的使用(实验演示)
源代码
14

————————————————
版权声明:本文为CSDN博主「楠鹤晴」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/m0_63019745/article/details/128138456

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值