原理
替换代码段和数据段,从磁盘加载新的代码段和数据段到物理内存,用页表映射回进程虚拟地址空间的代码段、数据段,同时应该将堆栈、命令行参数等变为最初状态,pid 不变、环境变量不变、
应用
exec 函数簇:多个 ecec 结构的函数
int execl(const char* path, const char* arg,...)
path: 带路径的可执行程序,绝对或相对路径
arg: 给可执行程序传递的参数,规定:第一个参数必须是可执行程序的名称
...: 可变参数列表,参数列表要以 NULL 标志参数结束
l :可变参数列表的函数,参数列表要以 NULL 标志参数结束
int execlp(const char* file, const char* arg,...)
file: 可执行文件的名称,可执行程序是必须在环境变量 PATH 当中可以找到的,也可以直接传入可执行程序的绝对路径
p :如果带 p,要替换的程序可以直接给一个程序的名称,回去搜索当前环境变量
int execle(const char* path, const char* arg,..., char* consst envp[])
envp: 给当前所要替换的程序设置环境变量,要以 NULL 结尾
e :如果带有 e,则需要自己去组织环境变量的内容
int execv(const char* path, const char* argv[])
argv: 传入字符数组指针,而不是可变参数列表
v :如果带有 v,则表示需要传入的程序命令行参数为字符数组指针,而不是可变参数列表,字符数组依旧需要以 NULL 结尾
其中,系统调用为 execve,其他的为库函数
使用场景
- 守护进程
基本具备的条件:server 可执行程序,守护进程的程序
守护进程是由守护程序启动的,在守护进程当中,使用到了创建子进程+进程程序替换+进程间通信(判断子进程是否运行正常)
获取状态发现 server 可执行程序并没有更改,则认为 server 状态异常,执行策略就是重新创建子进程,让子进程程序替换,替换为新的 server 可执行程序
server 可执行程序:通过进程间通信,每隔一段时间告诉父进程当前的状态
- shell终端
1.启动 bash 可执行程序
2.当用户输入命令时,创建子进程,子进程进程程序替换
3.在子进程进程程序替换时,如果是前台进程,则 bash 负责进程等待