进程程序替换

进程程序替换

  • 1.替换原理
  • 2.替换函数
  • 3.命令理解

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

1.替换原理

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

2.替换函数

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

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

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

②int execlp(const char* file,const char* argv,…);
进程程序替换_第4张图片

#include 
  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[ ]);
进程程序替换_第5张图片
进程程序替换_第6张图片

#include 
    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 }

这个函数与上面的函数的区别就是多了一个传递环境变量参数
进程程序替换_第7张图片
可以发现使用这个参数可以使子进程继承父进程的环境变量
进程程序替换_第8张图片
进程程序替换_第9张图片

看这个代码,使用自定义的一个数组来传递环境变量,可以发现子进程所继承的环境变量只有arr的内容了,并没有其他的环境变量了,说明是覆盖式传入
④int execv(const char* path,char* const argv[ ]);
进程程序替换_第10张图片
这个函数的对于如何运行程序使用的是数组的方式。
⑤int execvp(const char* file,char* const argv[ ]);
这个函数的第一个参数是使用程序名,OS会自动在PATH环境变量下寻找
⑥int execvpe(const char* file,char* const argv[ ],char* const envp[ ]);
进程程序替换_第11张图片
进程程序替换_第12张图片
⑦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的相关知识,干货满满,如果觉得博主写的还不错的话,希望各位小伙伴不要吝啬手中的三连哦!你们的支持是博主坚持创作的动力!

你可能感兴趣的:(Linux的学习,linux,运维,服务器,程序替换原理)