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.rhkb.cn/news/94165.html

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

相关文章

MySQL—缓存

目录标题 为什么要有Buffer Poolbuffer pool有多大buffer pool缓存什么 如何管理Buffer Pool如何管理空闲页如何管理脏页如何提高缓存命中率预读失效buffer pool污染 脏页什么时候会被刷入到磁盘 为什么要有Buffer Pool 虽然说MySQL的数据是存储在磁盘中,但是也不能…

爬虫IP时效问题:优化爬虫IP使用效果实用技巧

目录 1. 使用稳定的代理IP服务提供商: 2. 定期检测代理IP的可用性: 3. 配置合理的代理IP切换策略: 4. 使用代理IP池: 5. 考虑代理IP的地理位置和速度: 6. 设置合理的请求间隔和并发量: 总结 在爬虫过…

【JAVA】数组练习

⭐ 作者:小胡_不糊涂 🌱 作者主页:小胡_不糊涂的个人主页 📀 收录专栏:浅谈Java 💖 持续更文,关注博主少走弯路,谢谢大家支持 💖 数组练习 1. 数组转字符串2. 数组拷贝3.…

Layui列表复选框根据条件禁用

// 禁用客服回访id有值的复选框res.data.forEach(function (item, i) {if (item.feedbackEmpId) {let index res.data[i][LAY_TABLE_INDEX];$(".layui-table tr[data-index"index"] input[typecheckbox]").prop(disabled,true);$(".layui-table tr[d…

c++--SLT六大组件之间的关系

1.SLT六大组件: 容器,迭代器,算法,仿函数,适配器,空间配置器 2.六大组件之间的关系 容器:容器是STL最基础的组件,没有容器,就没有数据,容器的作用就是用来存…

【ArcGIS Pro二次开发】(60):按图层导出布局

在使用布局导图时,会遇到如下问题: 为了切换图层和导图方便,一般情况下,会把相关图层做成图层组。 在导图的时候,如果想要按照图层组进行分开导图,如上图,想导出【现状图、规划图、管控边界】3…

【数据结构】 ArrayList简介与实战

文章目录 什么是ArrayListArrayList相关说明 ArrayList使用ArrayList的构造无参构造指定顺序表初始容量利用其他 Collection 构建 ArrayListArrayList常见操作获取list有效元素个数获取和设置index位置上的元素在list的index位置插入指定元素删除指定元素删除list中index位置上…

电商增强现实3D模型优化需要关注的4个方面

到目前为止,AR技术已经发展到足以在更广泛的范围内实施。 在电子商务中,这项技术有望提供更令人兴奋的购物体验。 为了实现这一目标,在这篇博客中,我将介绍如何针对电子商务中的 AR 优化 3D 模型。 推荐:用 NSDT编辑器…

企业计算机服务器中了360后缀勒索病毒怎么办,勒索病毒解密数据恢复

随着计算机技术的不断发展,企业的办公系统得到了很大提升,但是随之而来的网络安全威胁也不断增加,勒索病毒的攻击事件时有发生。近期,我们收到某地连锁超市的求助,企业的计算机服务器遭到了360后缀勒索病毒攻击&#x…

小程序具体开发

window 导航栏 属性名类型默认值作用navigationBarTitleText string字字符串导航栏标题内容navigationBarBackgroundColorHexcolor#000000设置导航栏背景颜色(比如荧黄色 #ffa)navigationBarTextStylestringwhite设置导航栏标题的颜色(仅含有…

R语言实现神经网络(1)

#R语言实现神经网络 library(neuralnet) library(caret) library(MASS) library(vcd) data(shuttle) str(shuttle)#因变量use; table1<-structable(windmagn~use,shuttle) mosaic(table1,shadingT) mosaic(use~errorvis,shuttle) prop.table(table(shuttle$use,shuttle$stab…

Android Drawable转BitmapDrawable再提取Bitmap,Kotlin

Android Drawable转BitmapDrawable再提取Bitmap&#xff0c;Kotlin <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"match_parent"…

【计算机网络篇】UDP协议

✅作者简介&#xff1a;大家好&#xff0c;我是小杨 &#x1f4c3;个人主页&#xff1a;「小杨」的csdn博客 &#x1f433;希望大家多多支持&#x1f970;一起进步呀&#xff01; UDP协议 1&#xff0c;UDP 简介 UDP&#xff08;User Datagram Protocol&#xff09;是一种无连…

绘制 PCA 双标图和碎石图

1、双标图 import numpy as np import matplotlib.pyplot as plt from sklearn.decomposition import PCA from sklearn.preprocessing import StandardScaler from sklearn import datasets# data np.random.random((1000,10)) # y np.random.randint(0,6,1000)iris datase…

OJ练习第149题—— 二叉树中的最大路径和

二叉树中的最大路径和 力扣链接&#xff1a;124. 二叉树中的最大路径和 题目描述 二叉树中的 路径 被定义为一条节点序列&#xff0c;序列中每对相邻节点之间都存在一条边。同一个节点在一条路径序列中 至多出现一次 。该路径 至少包含一个 节点&#xff0c;且不一定经过根…

【刷题笔记8.17】LeetCode:最长公共前缀

LeetCode&#xff1a;最长公共前缀 &#xff08;一&#xff09;题目描述 编写一个函数来查找字符串数组中的最长公共前缀。 如果不存在公共前缀&#xff0c;返回空字符串 “”。 &#xff08;二&#xff09;分析 纵向扫描时&#xff0c;从前往后遍历所有字符串的每一列&am…

设计模式之门面模式(Facade)的C++实现

1、门面模式提出 在组件的开发过程中&#xff0c;某些接口之间的依赖是比较紧密的&#xff0c;如果某个接口发生变化&#xff0c;其他的接口也会跟着发生变化&#xff0c;这样的代码违背了代码的设计原则。门面设计模式是在外部客户程序和系统程序之间添加了一层中间接口&…

【校招VIP】前端vue考点之生命周期和双向绑定

考点介绍&#xff1a; VUE是前端校招面试的重点&#xff0c;而生命周期和双向绑定又是基础考点之一&#xff0c;尤其在一二线公司&#xff0c;要求知道双向绑定的原理&#xff0c;以及相关代码实现。 『前端vue考点之生命周期和双向绑定』相关题目及解析内容可点击文章末尾链接…

实时会话简易版

1、数据存储 Redis缓存、pgsql数据库 2、存储使用 2.1、Redis缓存 1&#xff09;无序集合set&#xff1a;存储未读会话id 2&#xff09;list&#xff08;左进右出&#xff09;&#xff1a;存储会话未读消息 2.2、pgsql数据库 存储用户信息&#xff0c;存储会话id&#…

带你了解Cloudquery 安装使用功能

&#x1f3e0;个人主页&#xff1a;晨犀主页 &#x1f9d1;个人简介&#xff1a;大家好&#xff0c;我是晨犀&#xff0c;希望我的文章可以帮助到大家&#xff0c;您的满意是我的动力&#x1f609;&#x1f609; &#x1f495;欢迎大家&#xff1a;这里是CSDN&#xff0c;我总结…