一.进程替换的原理
进程调用通常使用exec的函数,当调用该函数时,进程的代码和数据将被新进程所替代,其实通俗的话将就是将磁盘上的新程序加载到物理内存原来指向的位置上,这样就会替换掉原来进程所有的代码和数据。同时页表和进程地址空间没有发生变化。值得注意的是在调用exec函数之前的旧进程的代码还是会实现的,因为这个时候进程还没有进行替换。
二.六种替换函数
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[]);
带v的,意味着它的参数格式是数组,带 l 的意味着它的参数格式是参数列表,带p的意味着不需要指定路径,他会自行寻找目标位置,带 e 的需要自行传入环境变量。
使用方法如下:
第一个参数是这个命令的路径,第二个参数是命令名称,第三个是命令行参数,第四个NULL是固定的表示截至
execl("/bin/ps", "ps", "-ef", NULL);
第一个参数表示部分路径,他会自行搜索,其余于参数与上文一致
execlp("ps", "ps", "-ef", NULL);
需要多传一个环境变量,这个也能解释子进程继承父进程环境变量
execle("ps", "ps", "-ef", NULL, envp);
其实本质和上文是一样的,只不过将参数放在数组内,传的是数组
char *const argv[] = {"ps", "-ef", NULL};
execvp("ps", argv);