进程程序替换

🌟🌟hello,各位读者大大们你们好呀🌟🌟
🚀🚀系列专栏:【Linux的学习】
📝📝本篇内容:替换原理;替换函数;命令解释
⬆⬆⬆⬆上一篇:Linux进程控制(一)
💖💖作者简介:轩情吖,请多多指教(> •̀֊•́ ) ̖́-

1.替换原理

当进程调用一种exec函数时,该进程的用户空间代码和数据完全被新程序替换,从新程序的启动例程开始执行。调用exec并不是创建新进程,所以说调用exec前后该进程的pid并未改变
站在新程序的角度,就是程序被加载了,而exec函数就是一个加载器
在这里插入图片描述
可以发现,并没有打印出a的值,说明当执行到exec函数时,直接将旧代码和数据代替了。

2.替换函数

其实有六种以exec开头的函数,统称为exec函数,都包含在#include <unistd.h>头文件中
①int execl(const char* path,const char* arg,…);
如果替换成功,不会有返回值,如果替换失败,一定有返回值
不用对该函数进行返回值判断,只要继续向后运行一定是失败的!
执行程序替换,新的代码和数据就被加载了,后续代码属于老代码,直接被替换了,没机会执行了。并且程序替换是整体替换,不能局部替换
当执行程序时,OS也是以加载的方式来操作的
子进程加载新程序的时候,是需要进行程序替换的,发生写时拷贝(写时拷贝也能在代码区发生)
在这里插入图片描述

#include <stdio.h>
  2 #include <unistd.h>
  3 int main()
  4 {
  5 execl("/usr/bin/ls","ls","-l",NULL);                                                                    
  6 printf("进程替换失败\n");
  7 
  8   return 0;
  9 }

在这里插入图片描述
第一个参数就是替换程序的绝对路径,第二个参数是你想怎么执行这个程序,后面的可变参数也是如此,你想怎么执行这个程序,就是他的程序选项,在最后必须加上NULL,代表你的输入结束。

②int execlp(const char* file,const char* argv,…);
在这里插入图片描述

#include <stdio.h>
  2 #include <unistd.h>
  3 int main()
  4 {
  5 //execl("/usr/bin/ls","ls","-l",NULL);                                                                  
  6 execlp("ls","ls","-l",NULL);
  7 printf("进程替换失败\n");
  8 
  9   return 0;
 10 }

其中第一个参数变成了只要指定程序名,它会自动去PATH环境变量下的路径去找
③int execle(const char* path,const char* arg,…,char* const envp[ ]);
在这里插入图片描述
在这里插入图片描述

#include <stdio.h>
    2 #include <unistd.h>
    3 #include <stdlib.h>
    4 int main()
    5 {
    6 //execl("/usr/bin/ls","ls","-l",NULL);
    7 //execlp("ls","ls","-l",NULL);
W>  8 putenv("val=10");//将环境变量放入环境变量表                                                           
    9 extern char** environ;
   10 execle("/home/lnb/linux-l/写博客-进程进程替换/childtest","./childtest",NULL,environ);
   11 printf("进程替换失败\n");
   12 
   13   return 0;
   14 }

这个函数与上面的函数的区别就是多了一个传递环境变量参数
在这里插入图片描述
可以发现使用这个参数可以使子进程继承父进程的环境变量
其实前面的几个函数(没有要求传递环境变量的函数)他们也会自动传递环境变量
在这里插入图片描述
在这里插入图片描述

看这个代码,使用自定义的一个数组来传递环境变量,可以发现子进程所继承的环境变量只有arr的内容了,并没有其他的环境变量了,说明是覆盖式传入,原来父进程所有的环境变量都被覆盖了,只传递了数组中的环境变量,可以自由控制想要传递的环境变量
④int execv(const char* path,char* const argv[ ]);
在这里插入图片描述
这个函数的对于如何运行程序使用的是数组的方式。
⑤int execvp(const char* file,char* const argv[ ]);
这个函数的第一个参数是使用程序名,OS会自动在PATH环境变量下寻找
⑥int execvpe(const char* file,char* const argv[ ],char* const envp[ ]);
在这里插入图片描述
在这里插入图片描述
⑦int execve(const char* path,char* const argv[ ],char* const envp[ ]);
这个函数参数与上面的那些函数的类似
事实上,只有execve是真正的系统调用,其他的函数最终都调用execve,所以execve在man手册第2节,其他函数在man手册第3节。

3.命令理解

l(list):表示参数采用列表
v(vector):参数用数组
p(path):有p自动搜索环境变量PATH
e(env):表示自己维护环境变量,自定义环境变量是覆盖式传入

🌸🌸进程程序替换的知识大概就讲到这里啦,博主后续会继续更新更多Linux的相关知识,干货满满,如果觉得博主写的还不错的话,希望各位小伙伴不要吝啬手中的三连哦!你们的支持是博主坚持创作的动力!💪💪

  • 11
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 7
    评论
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

轩情吖

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值