进程程序替换
- 进程程序替换原理
fork创建子进程执行的是和父进程相同的程序(也有可能是某个分支),通常fork出的子进程是为了完成父进程所分配的任务,所以子进程通常会调用一种exec函数(六种中的任何一种)来执行另一个任务。当进程调用exec函数时,当前用户空间的代码和数据会被新程序所替换,该进程就会从新程序的启动历程开始执行。在这个过程中没有创建新进程,所以调用exec并没有改变进程的id。
- 替换图解(图解)
exec函数族
1. 执行指定目录下的程序
int execl(const char *path, const char *arg, ...);
分析:
- path: 要执行的程序的绝对路径
- 变参arg: 要执行的程序的需要的参数
- 第一arg:占位
- 后边的arg: 命令的参数
- 参数写完之后: NULL
- 一般执行自己写的程序
2. execv函数原型:
int execv(const char *path, char *const argv[]);
分析:
- path = /bin/ps
- char* args[] = {"ps", "aux", NULL};
- execv("/bin/ps", args);
3. 执行PATH环境变量能够搜索到的程序
int execlp(const char *file, const char *arg, ...);
分析:
- file: 执行的命令的名字
- 第一arg:占位
- 后边的arg: 命令的参数
- 参数写完之后: NULL
- 执行系统自带的程序
- execlp执行自定义的程序: file参数绝对路径
注意:如果file中包含/,则将其视为路径名,否者就按PATH环境变量,在它指定的各目录中搜可执行文件
4. execvp函数原型:
int execle(const char *path, const char *arg, ..., char *const envp[]);
5. 执行指定路径, 指定环境变量下的程序
int execle(const char *path, const char *arg, ..., char *const envp[]);
分析:
- path: 执行的程序的绝对路径 /home/itcast/a.out
- arg: 执行的的程序的参数
- envp: 用户自己指定的搜索目录, 替代PATH
- char* env[] = {"/home/itcast", "/bin", NULL};
6. execve函数原型:
int execve(const char *path, char *const argv[], char *const envp[]);
二、代码清单
1. 测试代码:
1 #include <unistd.h> 2 #include <stdio.h> 3 #include <stdlib.h> 4 5 int main() 6 { 7 for(int i = 0; i < 8; ++i) 8 printf(" parent i = %d ", i); 9 pid_t pid = fork(); 10 if(pid == 0) 11 { 12 execlp("ps", "ps", "aux", NULL); 13 perror("execlp"); 14 exit(1); 15 } 16 for(int i = 0; i < 3; ++i) 17 printf("----------- i = %d ", i); 18 return 0; 19 }
输出结果: