【Linux】进程控制(四):进程程序替换 exec 函数簇
文章目录
一、进程程序替换
1.1 概念
用 fork 创建子进程后执行的是和父进程相同的程序,此时子进程就需要进程程序替换,进程程序替换就是将已经跑起来的进程替换成执行其它程序的进程,也就是说该进程的用户空间代码和数据完全被新程序替换,子进程从新程序的启动历程开始执行。
1.2 原理
替换函数将正在执行的进程的进程虚拟地址空间里的代码段和数据段替换成新的程序,当前在执行的进程就会执行替换之后的程序代码,并且堆区和栈区都需要更新。
1.3 为什么要进程程序替换
守护进程先启动,创建一个子进程,让子进程程序替换成为另一个程序,实现不同的一个功能,父子进程会进行通信,实现 “当子进程异常退出时,守护进程就会重新拉起子进程”。(但不能说守护进程一定能够解决子进程异常退出的问题,异常退出可能是子进程的程序代码存在一定的问题)
我们常用的 shell 命令行解释器,就是采用的进程程序替换的原理。
二、进程替换接口
exce 函数簇: 它不是一个函数,而是一堆函数。(execl 、execlp、execle、execv、execvp、execve)
#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[]); //库函数
int execve(const char *file, char *const argv[],char *const envp[]); //系统调用
2.1 execl 函数
#include <unistd.h>
//库函数
int execl(const char *path, const char *arg, ...);
参数:
path: 带路径的可执行程序,即替换的可执行程序的路径和名称
arg: 给可执行程序传递的参数(传递的第一个参数必须是可执行程序的名称,后面依次传递,中间以 “逗号” 隔开,最后以 “NULL” 结束)
返回值:
替换成功,没有返回值;替换失败,返回小于 0 的值,仍旧执行当前的程序代码。
验证:
shift 程序替换 execl 程序