linux:进程替换

更多知识点:linux目录索引


概念

进程替换是指把当前进程替换为一个新的程序。替换进程使用 exec 系列函数。进程被exec 替换后,运行中的程序就开始执行由 exec 指定的新的可执行程序中的代码。新进程的 PID、 PPID 与原进程完全一样。 并且, exec 一般是不会返回的,因为原进程已经被完全替换掉了,除非发生错误,出错时, exec 返回-1。

进程替换的原理

fork创建出子进程,子进程将父进程PCB中的内容全部复制过来,其中包括代码段和数据段,故子进程和父进程执行的是相同的程序(有可能执行不同的分之)。当子进程想要执行其他程序时,需要将自己的程序进行替换,故调用exec函数来执行另一个程序。当调用exec函数时,子进程中的数据和代码完全被新的进程替换掉,此时子进程执行的是新进程。但exec函数不创建新的进程,所以调用exec前后进程的id并未改变

这里写图片描述

进程替换函数

注意:6 个函数中只有 execve 是真正意义上的系统调用(内核提供的接口),其他函数都是在此基础上经过封装的库函数。

#include <unistd.h>
int execl(const char *path, const char *arg, ..., (char*)0);
int execlp(const char *file, const char *arg, ..., (char*)0);
int execle(const char *path, const char *arg, ..., (char*)0, char * constenvp[]);
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[]);

参数介绍:

  1. l(list):参数地址列表,以空指针结尾。

  2. v(vector):存有各参数地址的指针数组地址,使用时先构造一个指针数组,指针数组存各参数的地址,然后奖该指针数组作为函数的参数

  3. p(path):按系统环境变量 PATH 指定的目录去搜索可执行文件。文件名由第一个参数file 指定,当指定的文件名中包含/,则将其视为路径名,并直接到指定的路径中执行程序。

  4. e(environment):存有环境变量字符串地址的指针数组首地址。 execle 和 execve 改变的是 exec 启动的程序的环境变量(新的环境变量完全由 environment 指定)。其他四个函数启动的程序则使用默认系统环境变量。

部分函数的介绍

  1. execlp
int execlp(const char *file, const char *arg, .....);

char *const ps_argv[] = {"ps", "ax", NULL};
execlp("ps", "ps", "ax", NULL);

参数:
    第一个"ps"是可执行程序;
    后面"ps" "ax"NULL 是可执行程序的内容
  1. execvp
int execvp(const char* file,char* const argv[]);
//形参分别为(可执行程序名,main函数参数列表)
//第一个参数:可执行程序所在的绝对位置
//第二个参数:可执行程序运行时所需的参数,这里是一个可变参数,每个参数之间用逗号分割
//参数结束时,最后一个参数是:NULL

这里对“最后一个参数是:NULL”进行解释,纯属个人看法,如有错误,还望指正:main函数中的可变参数列表中不需要手动加NULL的原因是“main函数的第一个参数代表后面可变参数的个数,因此只需要循环第一个参数代表的次数即可停止”,而execvp的第一个参数代表的是可执行程序所在的绝对位置,并不是后面可变参数的个数,因此需要手动加NULL作为停止的条件。

猜你喜欢

转载自blog.csdn.net/zhangye3017/article/details/80020176