hello,各位读者大大们你们好呀
系列专栏:【Linux的学习】
本篇内容:替换原理;替换函数;命令解释
⬆⬆⬆⬆上一篇:Linux进程控制(一)
作者简介:轩情吖,请多多指教(> •̀֊•́ ) ̖́-
当进程调用一种exec函数时,该进程的用户空间代码和数据完全被新程序替换,从新程序的启动例程开始执行。调用exec并不是创建新进程,所以说调用exec前后该进程的pid并未改变
站在新程序的角度,就是程序被加载了,而exec函数就是一个加载器
可以发现,并没有打印出a的值,说明当执行到exec函数时,直接将旧代码和数据代替了。
其实有六种以exec开头的函数,统称为exec函数,都包含在#include
①int execl(const char* path,const char* arg,…);
如果替换成功,不会有返回值,如果替换失败,一定有返回值
不用对该函数进行返回值判断,只要继续向后运行一定是失败的!
执行程序替换,新的代码和数据就被加载了,后续代码属于老代码,直接被替换了,没机会执行了。并且程序替换是整体替换,不能局部替换
当执行程序时,OS也是以加载的方式来操作的
子进程加载新程序的时候,是需要进行程序替换的,发生写时拷贝(写时拷贝也能在代码区发生)
#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 }
第一个参数就是替换程序的绝对路径,第二个参数是你想怎么执行这个程序,后面的可变参数也是如此,你想怎么执行这个程序,就是他的程序选项,在最后必须加上NULL,代表你的输入结束。
②int execlp(const char* file,const char* argv,…);
#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[ ]);
#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 }
这个函数与上面的函数的区别就是多了一个传递环境变量参数
可以发现使用这个参数可以使子进程继承父进程的环境变量
看这个代码,使用自定义的一个数组来传递环境变量,可以发现子进程所继承的环境变量只有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节。
l(list):表示参数采用列表
v(vector):参数用数组
p(path):有p自动搜索环境变量PATH
e(env):表示自己维护环境变量,自定义环境变量是覆盖式传入
进程程序替换的知识大概就讲到这里啦,博主后续会继续更新更多Linux的相关知识,干货满满,如果觉得博主写的还不错的话,希望各位小伙伴不要吝啬手中的三连哦!你们的支持是博主坚持创作的动力!