为什么要进行进程程序替换
父进程创建出来的子进程与父进程拥有相同的代码,所以,子进程看到的代码和父进程是一样的。当我们想要让子进程执行不同的程序时,就需要让子进程调用进程程序替换的接口,从而让子进程执行不一样的代码。
原理:替换进程的代码段和数据段,更新堆栈。
替换函数
其实有六种以exec开头的函数,统称exec函数:
头文件:#include <unistd.h>
int execl(const char *path, const char *arg, ...);
int execlp(const char *file, const char *arg, ...);
int execle(const char *path, const char *arg, ...,char *const envp[]);
int execv(const char *path, char *const argv[]);
int execvp(const char *file, char *const argv[]);
int execve(const char *path, char *const argv[],char *const envp[]);
函数解释
这些函数如果调用成功则加载新的程序从启动代码开始执行,不再返回。
如果调用出错则返回-1
所以exec函数只有出错的返回值而没有成功的返回值。
命令理解
l(list)
: 表示参数采用列表
v(vector)
: 参数用数组
p(path)
: 有p自动搜索环境变量PATH
e(env)
: 表示自己维护环境变量
以
execl为例
找到其路径:
替换成功如下:
事实上,只有execve是真正的系统调用,其它五个函数最终都调用 execve。