Linux系统编程---进程替换

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/shanghx_123/article/details/83688657

进程替换

我们知道,在 Windows 平台下,我们可以通过双击运行可执行程序,让这个可执行程序成为一个进程;而在 Linux 平台,我们可以通过 ./ 运行,让一个可执行程序成为一个进程。

但是,如果我们本来就运行着一个程序(进程),我们如何在这个进程内部启动一个外部程序,由内核将这个外部程序读入内存,使其执行起来成为一个进程呢?这里我们通过 exec 函数族实现。并且,我们通常fork一个子进程,目的就是让它和父进程执行不同的程序,所以这时就要用到exec函数来实现进程替换。

exec 函数族,

顾名思义,就是一簇函数,在 Linux 中,并不存在 exec() 函数,exec 指的是一组函数,一共有 6 个:

#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 *path, char *const argv[], char *const envp[]);

exec 函数族的 6 个函数看起来似乎很复杂,但实际上无论是作用还是用法都非常相似,只有很微小的差别。掌握了规律就很好记住。

l(list): 参数地址列表,以空指针结尾。
v(vector): 存有各参数地址的指针数组的地址。
p(path): 按 PATH 环境变量指定的目录搜索可执行文件。
e(environment): 存有环境变量字符串地址的指针数组的地址。

函数名 参数格式 是否带路径 是否使用当前环境变量
execl 列表 不是
execlp 列表
execle 列表 不是 不是,须自己组装环境变量
execv 数组 不是
execvp 数组
execve 数组 不是 不是 ,须自己组装环境变量

exec 函数族提供了六种在进程中启动另一个程序的方法。exec 函数族的作用是根据指定的文件名或目录名找到可执行文件,并用它来取代调用进程的内容,换句话说,就是在调用进程内部执行一个可执行文件。

其中只有 execve() 是真正意义上的系统调用,其它5个都是在此基础上经过包装的库函数。所以execv在man手册第2节,其他在man函数手册第3节。

他们调用方式如图

在这里插入图片描述

注意:
进程调用一种 exec 函数时,该进程完全由新程序替换,而新程序则从其 main 函数开始执行。因为调用 exec 并不创建新进程,所以前后的进程 ID (当然还有父进程号、进程组号、当前工作目录……)并未改变。exec 只是用另一个新程序替换了当前进程的正文、数据、堆和栈段(进程替换)

在这里插入图片描述

扫描二维码关注公众号,回复: 4001311 查看本文章

猜你喜欢

转载自blog.csdn.net/shanghx_123/article/details/83688657