Linux 进程替换

一、进程替换

把一个进程替换为另外一个进程。对于进程,如果单纯只看复制或者单纯只看替换,没有太大的意义。将复制和替换结合在一起(fork+exec),就是系统去产生一个全新进程的一种方式。

将复制和替换结合在一起(fork+exec):
先fork,使系统中多出一个进程,默认情况下,fork之后,父进程和子进程的代码都一样,子进程是父进程的一个副本,那么把整个副本替换掉, 不会影响父进程,这样就产生了一个全新的进程。所以说系统中的所有新进程并不是直接创建出来的,而是通过fork+exec先复制再替换产生的。这样做的原因是,fork有一个特点,它会把父进程的信息继承给子进程,然后exec进行替换的时候把需要的信息留下,不需要的信息替换掉就可以了,如果是直接创建一个进程,有些信息需要填充,不像复制把父进程的资源复制了一份给了子进程。

二、exec方法

exec系列替换过程:pcb使用替换以前的,只修改了进程的名字,进程实体更换。

1、exec系列的方法

exec系列有多个方法,多个方法在功能本质上没有区别,只是为了适应在不同情况下更加便于使用,所以参数表示形式略有不同,本质上没有任何区别。
(1)int execl(const char* path, const char * arg,...);
(2)int execlp(const char* file, const char * arg,...);
(3)int execle(const char* path, const char * arg,...,char* const envp[]);
(4)int execv(const char * path, char* const argv[]);
(5)int execvp(const char * file, char* const argv[]);
(6)int execve(const char * path, char* const argv[],char* const envp[]);
前5个方法是库函数,最后一个方法是系统调用,前5个方法最终都调用了execve去完成的。

参数解释:
*path:新替换的程序的路径名称
*arg:传给新程序主函数的第一个参数,一般为程序的名字
*arg后面:是剩余参数列表,参数个数可变,必须以空指针作为最后一个参数

替换成功没有返回值,替换失败才有返回值,因为替换成功就变成了因为一个进程,没被替换之前的进程就消失了。

【例1】execl的应用举例,以ps替换当前程序为例

代码如下:

在这里插入图片描述

编译运行以上代码:

在这里插入图片描述

由结果可以看出,ps的pid是6331,程序输出的没有被ps替换之前的main程序的pid也是6331。所以可以得出结论,替换的是进程的实体,在替换之后pid是不发生变化的。替换之后,main程序就没有了。printf("替换失败\n");这一行代码是不会被输出的,因为替换成功之后,当前进程main就会直接消失,系统就将它销毁了,直接将ps装载起来了,将main成功替换为ps之后,会从ps的第一行代码开始执行,我们看到的也就是ps这个程序执行的结果。

【例2】execlp的应用举例,以ps替换当前程序为例

execlp中的p就是path,它相当于环境变量的意思,环境变量中就指定了可执行程序在那个位置存放着。所以使用execlp的时候第一个参数为替换掉当前进程的新进程的名称,不需要写路径,它自己会在环境变量path的相关位置帮我们去寻找。

代码如下:

在这里插入图片描述

编译并运行:

在这里插入图片描述

这个执行结果和用execl的执行结果没有任何区别,是相同的。只是execlp和execl的形式不同而已,它们的功能是相同的。在不方便加路径的情况下就可以用execlp。

【例3】execle的应用举例,以ps替换当前程序为例

execle和前面execl的区别就是把当前进程的环境变量传给了新进程。

代码如下:

在这里插入图片描述

编译并运行:

在这里插入图片描述

根据结果可以看出,使用execle和使用execl、execlp的功能是一模一样的,没有任何区别。只有在需要改变环境变量的时候才使用execle。

以上三种方法execl和execlp、execle在传参的时候是将参数一一列举出来,而以下三种方法是将所传的参数放入一个数组中。

【例4】execv的应用举例,以ps替换当前程序为例

execv相比较execl来说,它把传给新进程的参数放到了一个数组里面,然后在使用execv的时候就不需要写传给新进程的参数列表,直接写数组名就好了。

有以下代码:

在这里插入图片描述

编译及运行结果:

在这里插入图片描述

可以看出运行结果和前面的方法没有任何区别。

【例5】execvp的应用举例,以ps替换当前程序为例

execvp方法的使用是在execv的基础上将execv方法中的第一个参数改为替换掉当前进程的新进程的名称,不需要写路径。

在这里插入图片描述

编译并运行:

在这里插入图片描述

可以看出运行结果和前面的方法没有任何区别。

【例6】execve的应用举例,以ps替换当前程序为例

execve方法的使用是在execv的基础上给execv方法中加了一个环境变量作参数。

代码如下:

在这里插入图片描述

编译并运行:

在这里插入图片描述

可以看出运行结果和前面的方法没有任何区别。

【注意】execl、execlp、execle、execv、execvp最终内核看到的都是execve的形式。

使用exec系列方法时根据实际情况选择合适的方法进行使用。

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

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

相关文章

Spring 自定义命名空间并解析 NameSpaceHandler

Spring 自定义命名空间解析器 1.主要步骤 主要有以下四步: 编写Schema文件自定义NameSpaceHandler 绑定命令空间自定义 BeanDefinitionParse 解析XML作为bd的配置元信息命名空间映射XML 2.代码实现 需要注意的时,把 spring.handlers 文件与 spring.s…

18万字应急管理局智慧矿山煤矿数字化矿山技术解决方案WORD

导读:原文《18万字应急管理局智慧矿山煤矿数字化矿山技术解决方案WORD》(获取来源见文尾),本文精选其中精华及架构部分,逻辑清晰、内容完整,为快速形成售前方案提供参考。 目 录 第一章 项目概述 1.1项目…

驱动 day4

通过字符设备驱动分步注册方式编写LED灯的驱动&#xff0c;应用程序使用ioctl函数编写硬件控制 mycdev.c #include <linux/init.h> #include <linux/module.h> #include <linux/fs.h> #include <linux/cdev.h> #include <linux/device.h> #inc…

【JAVA】数组练习

⭐ 作者&#xff1a;小胡_不糊涂 &#x1f331; 作者主页&#xff1a;小胡_不糊涂的个人主页 &#x1f4c0; 收录专栏&#xff1a;浅谈Java &#x1f496; 持续更文&#xff0c;关注博主少走弯路&#xff0c;谢谢大家支持 &#x1f496; 数组练习 1. 数组转字符串2. 数组拷贝3.…

mysql 数据备份和恢复

操作系统&#xff1a;22.04.1-Ubuntu mysql 版本&#xff1a;8.033 binlog 介绍 binlog 是mysql 二进制日志 binary log的简称&#xff0c;可以简单理解为数据的修改记录。 需要开启binlog,才会产生文件&#xff0c;mysql 8.0 默认开启,开启后可以在 /var/lib/mysql &#xff…

Vim在Mac电脑中的下载与安装方法:MacVim

本文介绍在Mac系统电脑中&#xff0c;下载、安装文本编辑器Vim软件&#xff08;MacVim软件&#xff09;的具体方法。 在Mac系统电脑中&#xff0c;原本就带有一个非图形界面的Vim&#xff1b;只要我们在终端中&#xff0c;输入如下的代码&#xff0c;就可以查看系统自带的非图形…

JetPack Compose 学习笔记(持续整理中...)

1.为什么要学&#xff1f; 1.命令式和声明式 UI大战,个人认为命令式UI自定义程度较高,能更深入到性能,内存优化方面,而申明式UI 是现在主流的设计,比如React,React Native,Flutter,Swift UI等等,现在性能也逐渐在变得更好 2.还有一个原因compose 是KMM 是完整跨平台的UI基础 3.…

汇川脉冲伺服SV630P常用参数设置(博途PLC脉冲输出控制)

有关博途PLC脉冲输出控制功能块详细介绍,请查看下面博客链接: 博途1200PLC轴控功能块(脉冲轴)_博图 轴控块_RXXW_Dor的博客-CSDN博客STRUCT// 轴使能// 轴正向点动// 轴反向点动// 轴回原// 轴复位// 轴暂停// 轴快速停机// 轴绝对定位// 轴相对定位// 轴匀速运行// 修改轴参…

repmgr出现双主,并且时间线分叉,删除了最新的时间线节点

遇到的问题如下&#xff1a; 2023-08-17 20:24:21.566 CST [1556001] LOG: database system was interrupted; last known up at 2023-08-17 20:21:41 CST 2023-08-17 20:24:21.770 CST [1556001] LOG: restored log file "00000009.history" from archive cp: 无法…

freeswitch的mod_xml_curl模块动态获取configuration

概述 freeswitch是一款简单好用的VOIP开源软交换平台。 mod_xml_curl模块支持从web服务获取xml配置&#xff0c;本文介绍如何动态获取acl配置。 环境 centos&#xff1a;CentOS release 7.0 (Final)或以上版本 freeswitch&#xff1a;v1.6.20 GCC&#xff1a;4.8.5 web…

Tomcat+Http+Servlet

文章目录 1.HTTP1.1 请求和响应HTTP请求&#xff1a;请求行请求头请求体HTTP响应&#xff1a;响应行&#xff08;状态行&#xff09;响应头响应体 2. Apache Tomcat2.1 基本使用2.2 IDEA中创建 Maven Web项目2.3 IDEA中使用Tomcat 3. Servlet3.1 Servlet快速入门3.2 Servlet执行…

PHP手术麻醉系统源码,自动生成麻醉和护理医疗文书

一套手术麻醉系统源码&#xff0c;可二次开发 手术室麻醉临床信息系统&#xff08;AIMS&#xff09;是应用于医院手术室、麻醉科室的计算机软件系统。该系统针对整个围术期&#xff0c;对病人进行全程跟踪与信息管理&#xff0c;自动集成病人HIS、LIS、RIS、PACS信息&#xff0…