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

【Linux】进程替换

1.进程程序替换

1.快速见见效果

        我的程序竟然把系统中的指令跑起来了,这种现象就叫进程替换,那为什么后面的那句printf没有执行呢?因为一旦程序替换成功,就会去执行新代码了,原始代码的后半部分,已经不存在了。那么会不会替换失败呢?把代码故意修改错误,并让他返回错误代码,发现他没有返回错误代码,替换失败了,把后面的未替换的代码已经执行了。

        我们查看了一下exec的手册,exec*系列的函数,只有失败返回值,没有成功返回值,exec*系列的函数,不用做返回值判断,只要返回,就是失败。

2.进程替换的原理——fork

        程序替换的过程中,并没有创建新的进程,只是把当前进程的代码和数据用新的程序的代码和数据覆盖式的进行替换。

代码验证:替换之后,pid并没有改变,说明并没有创建新的进程。

3.认识全部接口

        这是所有的接口,它们都以exec开头,而后面的部分有不同的命名方案。exec*系列就类似一种加载器;如果有加载器的实现,那么它的系统调用一定也是exec系列的函数。这里只挑选部分重要来讲。

        第一个参数:路径+程序名,作用:让exec替换、执行谁;第二个参数:我想怎么执行它;而最后的...代表为可变参数,参数个数是不确定的,必须以NULL结尾,表明参数传递完成;当你不知道怎么写参数时,写命令行时怎么写,你就怎么传。

        execl中l的意思即为把怎么执行它的方式以列表传给execl。

        那么有没有什么方法可以让它不替换我们的当前进程,不影响到当前进程的运行呢,我们可以创建一个子进程,让子进程被替换掉,就不会影响当前进程了。那么他为什么不会影响父进程呢?

  1. 进程具有独立性;
  2. 数据和代码发生写时拷贝。

        那么能用我们自己写的程序去替换吗?可以的,只要是进程,就可以进行进程替换。程序替换,是一个系统级的概念。

        execlp中的p是PATH的缩写,只告诉它要执行的文件名即可,因为execlp会自动在环境变量PATH中查找指定的命令。后面的参数传递同上。

        有个疑问,这两个ls不冲突吗?不会冲突,虽然传递的是一样的参数,但是其含义和作用是不一样的;前一个ls是让其去环境变量中查找,而后一个ls是如何执行它。

        第一个参数传递同execl。execv中的v意思为vector,意为数组,也就是数组传参,提供一个命令行参数表,也就是一个指针数组。

        参数同历史,第一个参数同execlp,第二个参数同execv。

        execvpe中的v、p都知道是什么含义了,e代表的是环境变量。

  • const char *file:指定要执行的程序的路径或文件名。
  • char *const argv[]:是一个字符串数组,用于传递给新程序的命令行参数,第一个参数通常是程序名本身,最后一个元素必须是 NULL,以表示参数列表的结束。
  • char *const envp[]:也是一个字符串数组,用于传递环境变量给新程序,每个元素的形式为“环境变量名=环境变量值”,最后一个元素同样为 NULL。 

来看看下面的代码和执行结果:

        我们也可以自定义新的环境变量列表,那么最后一个参数就会要求被替换的子进程使用全新的env列表,来把历史上的环境变量给替代。如果不想使用新的环境变量替代,不替代历史的环境变量,而是以新增的方式该怎么做呢?其实即使不传递这个新的环境变量,函数默认也会将新的环境变量添加到旧的环境变量列表中。因为有前面提到过的一个envir全局指针,并且环境变量和命令行参数不属于堆和栈,而是属于自己的一部分空间,传递给子进程时子进程也是能知道历史的环境变量的。

        如果我就是想要以新增方式去传递新的环境变量呢?

        可以调用这个函数,新增环境变量。假如有进程A、B、C,A创建了B,B创建了C,而B调用了putenv,那么A是看不到B新增的环境变量,C却可以看见。B是新增到自己的环境变量里的。所以想以新增方式给子进程增加环境变量,第一种只需要直接putenv;第二种就是使用exce*e,然后putenv到当前进程(不管父还是子)的地址空间里,然后传environ就行。

其实这组函数一共提供了七个接口,上面所提到的六个接口,都是语言封装的,只有第七个是系统调用级别的,上文的六个接口使用时调用的是第七个的系统提供的接口。之所以要做语言封装是因为并不是使用时都会出现刚好的三种参数,而是会出现各种各样的需求。但是到最后都会被系统转化为原始的三个参数。

http://www.dtcms.com/a/406815.html

相关文章:

  • wordpress调用目录网址seo查询
  • 【C++】模版专题
  • K8s实践中的重点知识
  • 云栖2025 | 人工智能平台 PAI 年度发布
  • 【文献管理工具】学术研究的智能助手—Zotero 文献管理工具详细图文安装教程
  • H5平台网站建设wordpress 会话已过期
  • 建论坛网站印度人通过什么网站做国际贸易
  • UniApp ConnectSocket连接websocket
  • 正点原子【第四期】Linux之驱动开发学习笔记-5.1 设备树下的LED驱动实验
  • uniapp中全局封装一个跨组件的复制粘贴方法
  • 新奇特:神经网络烘焙坊(上),权重矩阵的甜蜜配方之谜
  • 分布式调度问题:定时任务
  • labelimg(目标检测标注工具)的安装、使用教程和问题解决
  • 【MFC】项目结构梳理
  • 中小企业声音克隆技术落地实践:痛点分析与轻量化解决方案建议
  • High precision single-photon object detection via deep neural networks,OE2024
  • 网站编程入门php做外贸网站好吗
  • 网站制作排名php自己写框架做网站
  • VMware+RockyLinux+ikuai+docker+cri-docker+k8s 自用 实践笔记(二)
  • Lambda
  • html网站开发代码公司网页设计实例教程
  • MySQL异步I/O性能优化全解析
  • SQL 执行计划解析:从 EXPLAIN 到性能优化的完整指南
  • jupyter notebook继续学习
  • 力扣2381. 字母移位 II
  • 平和县建设局网站安徽经工建设集团网站
  • Vue 配置代理
  • CatCTF2022 web wp
  • 知乎免费阅读网站石家庄新闻综合频道节目回看
  • 做网站后台主要负责什么最新室内装修风格图片