进程程序替换
要讲好这个我为大家准备了五个步骤
1. 先用代码给大家展示一下现象
2.解释原理
3.将代码改成多进程版
4.使用所有的方法,并认识函数参数的含义。
5.其他
我们现在开始第一个
1. 先用代码给大家展示一下现象
关于进程的替换一共有七个函数,我们先不解释先用起来给大家看看现象
代码如下:
现象如下:
对于现象说明: 我们执行的是我们自己写的代码的程序,为什么执行出来的效果和 LS 的效果一样呢? 原因是:excel 这种函数的作用就是,可以执行起来新的程序。
我们知道作用了,接下来为大家解释原理。
2.解释原理


我们可以理解为 “夺舍” ,替换完了什么都不会变,唯一的变化就是加载的时候代码数据有大有小。
3.将代码改成多进程版
原理:fork 去创建子进程,让子进程去替换,父进程等待子进程替换。
代码如下: 这里我们替换的还是 ls
运行如下:
我们的子进程执行 ls ,父进程等待成功。
注意:其实代码本身的意义不大,但是这可以让我们有更深层次的理解(关于子进程)
在以前我们创建子进程让子进程帮我们完成任务,一般来讲完成的都是父进程代码的一部分,
现在子进程有了全新的能力,完整的执行一整个程序。
在这里我们的子进程创建的进程可以直接修改数据(在物理内存里面建立新的代码,重新与子进程的页表建立新的映射关系,当查询的时候,子进程指向的新的代码,与父进程不同。)
我们尝试替换其他的函数看看会有什么样的结果: 试例 top
这是 top命令
我们使用代码来替换试一下会不会有同样的效果呢?
效果如下:
没有问题,所以当前我们可以替换任何想要替换的程序。
4.使用所有的方法,并认识函数参数的含义。
其实有六种以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[])

#include <unistd.h>
int main()
{char *const argv[] = {"ps", "-ef", NULL};char *const envp[] = {"PATH=/bin:/usr/bin", "TERM=console", NULL};execl("/bin/ps", "ps", "-ef", NULL);// 带p的,可以使用环境变量PATH,无需写全路径execlp("ps", "ps", "-ef", NULL);// 带e的,需要自己组装环境变量execle("ps", "ps", "-ef", NULL, envp);execv("/bin/ps", argv);// 带p的,可以使用环境变量PATH,无需写全路径execvp("ps", argv);// 带e的,需要自己组装环境变量execve("/bin/ps", argv, envp);exit(0);
}

以上就是今天的博客,感谢你的观看,明天持续为大家更新 自主编程shell
感谢你的观看!!!