进程程序替换为的是为了使父进程与子进程能够执行不同程序
因为父进程通过fork()创建的子进程,与父进程执行相同程序,当我们想让子进程执行不同的程序时,就需要使用exec函数将子进程与新程序替换
进程程序替换需要注意几点
- 程序替换不会创建新进程,也不会销毁进程
- 替换代的码和数据(从一个可执行文件中来)
- 替换后原有的堆和栈中的数据全都不要了,根据新的代码 的执行过程重新构建堆和栈的内同,类似于双击exe执行一个程序的过程(操作系统的加载器模块)
exec 函数族 其中参数有差异,底层原理差不多相同
exrcl 中的l意为 list,这个exec函数是一个可变参数列表的函数
| 函数 | 功能 |
|---|---|
| execl | 可变参数列表的函数 |
| execlp | 自动从PATH路径中找到可执行程序 |
| execle | 需要传入代替换程序路径,需要程序员自己管理环境变量 |
参数的含义依次是:替换的程序路径,所要替换的程序,命令行参数,以NULL识别结束
execl("/usr/bin/ls","ls","-l",NULL);
execlp("./program","program",NULL);
execle需要自定环境变量
char* env[3] = {0};
env[0] = "PATH=/home/user/path";
env[1] = "MYENV=abc";
env[2] = NULL;
execle("./program","program",NULL,env);
execv v意为数组,命令行参数以数组形式输入
同类型函数有 execv() , execvp(),execve() 的特性与上面所给的表格中功能相同
参数的含义依次是:替换的程序路径,命令行参数数组
char* argv[3] = {0};
argv[0] = "program";
argv[1] = "-a";
argv[2] = NULL; //数组中的最后一个以NULL结尾
execv("./program",argv);
如果在PATH环境变量中添加了当前路径,则可以省略输入路径地址
execvp("program",argv)
关于exec函数族的转化关系

本文介绍了Linux中进程程序替换的概念,旨在使父进程与子进程执行不同程序。通过exec函数,如execv、execvp等,可以实现不创建新进程的情况下替换代码和数据。在替换后,原有的堆和栈被重建,以执行新的程序。了解这些函数的用法和注意事项对于理解Linux进程操作至关重要。
4361

被折叠的 条评论
为什么被折叠?



