进程程序替换的原理:
替换正在运行的程序,让正在进行的程序
一个程序运行起来时,会有一个task_struct结构体,里面含有一个内存指针,而内存指针指向了虚拟地址空间,通过页表与物理内存进行映射。
替换程序替换所做的工作:
1.替换当前进程的代码段和数据段为新程序,刷新堆栈
2.进程替换完毕后,该进程的进程pid是没有变化的(结合公司岗位调度理解,你的岗位替换了,但是公司没换)
进程替换的函数:exec函数簇:
- int execl (const*path,const*arg,...)
path是替换进程的地址,arg是给可执行程序传命令行参数,....是可变参数列表
注意:1.第一个参数必须是可执行程序本身
2.可变参数列表也是填充给可执行程序的参数,需要以NULL结尾
返回值:替换成功,没有返回值,替换失败,返回值为-1
- int execlp (const char*file, const char *arg,...);
file:待要替换的可执行程序,可以不用给路径(与execl的区别,不用给路径的这个可执行程序一定要在PATH环境变量中可以搜索到)
函数名带P与不带P的区别 1.函数名称中带P。表示会自动搜索环境变量
2.函数名中不带P,表示不会自动搜索环境变量,需要给待替换的可执行程序带上路径
- int execle(const char*path, const char *arg, ..., char *const envp[]);
envp[]:表示程序员需要自己组织环境变量
函数名称中带有l表示函数的参数为可变参数列表,否则不是
函数名中带e和不带e的区别 带e表示程序员自己组织环境变量 不带e表示程序员不需要自己组织环境变量
- int execv(const char *path,char *const argv[]);
- int execvp(const char *file,char *const argv[]);
file:待要替换的可执行程序,可以不用给路径
argv[]:指针数组,保存的是可执行程序传递的参数
注意:1.数组的第一个元素必须是可执行程序本身
2.数组的最后一个元素应该为NULL
- int execve(const char*filename,char *const argv[],char *const envp[]);
filename:带有路径的可执行程序
argv:可执行程序传递的参数 第一个参数应该是其本身,最后一个参数应该是NULL
envp[]:程序员自己组织环境变量,最后一个参上一定是NULL
圈起来的都是库函数,库函数是依靠系统调用函数
进程程序替换在工业中常见的场景:
- bash的应用场景
2.守护进程
守护进程如何得知业务进程正常?
业务进程会在特定的时间内往一个内存中返回一个时间,守护进程在这个内存中拿取这个时间,如果时间没有发生变化则说明业务进程异常,此时守护进程会重新创建一个业务进程