原理
通过进程PCB当中内存指针,找到进程虚拟地址空间当中的数据段和代码段,通过页表映射将数据段和代码段映射到新程序的物理内存,即使用新的程序将之前进程的数据段和代码段进行更新。
常用的用法:一般情况下,都会先创建出来一个子进程,然后对子进程进行 进程程序替换
父进程(守护进程):判断子进程是否工作正常
- 正常:不用关心+轮询判断
- 不正常:子进程退出了,卡死了,父进程重新一个子进程
子进程(工作进程):
- 执行业务逻辑,为客户进行服务
exec函数簇
函数:
int execl(const char *path,const char* arg , ...)
path:带路径的可执行程序
arg:给可执行程序传递的参数
...... :可变参数列表,以NULL结尾
返回值: 只有失败的时候,才有返回值,返回值为-1
成功了,不会返回
int execlp(const char* file,const char *arg, ...)
file:可执行程序的名称,(一定需要注意当前程序是否在环境变量PATH当中可以被找到)
arg :给可执行程序传递的参数,(第一个参数是可执行程序的名称)
... :可变参数列表,以NULL结尾
如果exec函数的名称中带有p,会搜索环境变量,并且带p的第一个参数传入可执行程序的名称,不带p的传入带路径的可执行程序
int execle(const char* path,const char* arg, ... ,char* const envp[])
path :带路径的可执行程序
arg:可执行程序参数,以NULL结尾
envp :自己组织环境变量,如果不传入环境变量则认为当前进程没有环境变量
带e和不带e的区别:如果不带,则不需要组织环境变量。如果带e,则需要自己组织环境变量
int execv(const char*path,char *const argv[])
path:带路径的可执行程序
定参的函数,argv :要给可执行程序传递的参数,第一个参数是该程序的名称,以NULL结尾
int execvp(const char* file,char * const argv[])
file :可执行程序的名称,同时这个可执行程序要能在PATH环境变量当中找到,否则程序替换就失败;同时也可以传递一个带有路径的可执行程序
int exeve(const char* filename,char *const argv[], char *const envp[])
filename:可执行程序的名称
argv: 定参的函数 要给可执行程序传递的参数,第一个参数是该程序的名称,以NULL结尾
envp :自己组织环境变量,如果不传入环境变量则认为当前进程没有环境变量
l:给替换程序传递的参数是使用可变参数列表进行传递的
v:给替换程序传递的参数是使用字符指针数组进行传递的