一、exec函数说明
fork函数是用于创建一个子进程,该子进程几乎是父进程的副本,而有时我们希望子进程去执行另外的程序,exec函数族就提供了一个在进程中启动另一个程序执行的方法。它可以根据指定的文件名或目录名找到可执行文件,并用它来取代原调用进程的数据段、代码段和堆栈段,在执行完之后,原调用进程的内容除了进程号外,其他全部被新程序的内容替换了。另外,这里的可执行文件既可以是二进制文件,也可以是Linux下任何可执行脚本文件。
二、
exec函数族语法
实际上,在Linux中并没有exec函数,而是有6个以exec开头的函数族,下表列举了exec函数族的6个成员函数的语法。
所需头文件 | #include <unistd.h> |
函数说明 | 执行文件 |
函数原型 | int execl(const char *path, const char *arg, ...) |
int execv(const char *path, char *const argv[]) | |
int execle(const char *path, const char *arg, ..., char *const envp[]) | |
int execve(const char *path, char *const argv[], char *const envp[]) | |
int execlp(const char *file, const char *arg, ...) | |
int execvp(const char *file, char *const argv[]) | |
函数返回值 | 成功:函数不会返回 |
出错:返回-1,失败原因记录在error中 |
三、
1、execl函数
作用:执行一个文件
函数原型:int execl(const char *path,const char*arg,......);
头文件:#include<unistd.h>
返回值:
① 执行成功,函数无返回值。
② 执行出错,返回-1。可用perror()函数打印错误信息。
参数:
path:代表文件路径
arg:表示argv[0],argv[1],.......(各指令字符),最后一个以NULL结束。
2、execv函数
作用:执行一个文件
函数原型:int execv(const char *path,char *const argv[]);
头文件:#include <unistd.h>
返回值:执行成功,无返回值;执行出错,返回-1。
参数:
path:文件路径
argv:所有参数形成的指针数组,是数组里的指针,最后一个以NULL结束。
3、execle函数
作用:执行一个文件
函数原型:int execle(const char *path,const char *arg,......,char *const envp[]);
头文件:#include <unistd.h>
返回值:执行成功,无返回值;执行出错,返回-1。
参数:
path:文件路径
arg:表示argv[0],argv[1],.......(逐个列举各指令)
envp[]:环境变量数组,用于传递环境变量。
4、execve函数
作用:执行一个文件
函数原型:int execve(const char *filename, char *const argv[], char *const envp[]);
头文件:#include <unistd.h>
返回值:执行成功,无返回值;执行出错,返回-1。
参数:
filename:文件路径
argv:所有参数形成的指针数组,是数组里的指针,最后一个以NULL结束。
envp:环境变量数组,用于传递环境变量。
5、execvp函数
作用:执行一个文件
函数原型:int execvp(const char *file,char *const argv[]);
头文件:#include <unistd.h>
返回值:执行成功,无返回值;执行出错,返回-1。
参数:
file:文件名或路径,给出文件名时系统会自动从环境变量“$PATH”所指出的路径中进行查找。
argv:所有参数形成的指针数组,是数组里的指针,最后一个以NULL结束。
6、execlp函数
作用:执行一个文件
函数原型:int execlp(const char *file,const char *arg,......);
头文件:#include <unistd.h>
返回值:执行成功,无返回值;执行出错,返回-1。
参数:
file:文件名或路径,给出文件名时系统会自动从环境变量“$PATH”所指出的路径中进行查找。
arg:表示argv[0],argv[1],.......(逐个列举各指令)
总结:
这6 个函数在函数名和使用语法的规则上都有细微的区别,下面就可执行文件查找方式、参数表传递方式及环境变量这几个方面进行比较说明。
① 查找方式:上表其中前4个函数的查找方式都是完整的文件目录路径,而最后2个函数(也就是以p结尾的两个函数)可以只给出文件名,系统就会自动从环境变量“$PATH”所指出的路径中进行查找。
② 参数传递方式:exec函数族的参数传递有两种方式,一种是逐个列举的方式,而另一种则是将所有参数整体构造成指针数组进行传递。
在这里参数传递方式是以函数名的第5位字母来区分的,字母为“l”(list)的表示逐个列举的方式,字母为“v”(vertor)的表示将所有参数整体构造成指针数组传递,然后将该数组的首地址当做参数传给它,数组中的最后一个指针要求是NULL。读者可以观察execl、execle、execlp的语法与execv、execve、execvp的区别。
③ 环境变量:exec函数族使用了系统默认的环境变量,也可以传入指定的环境变量。这里以“e”(environment)结尾的两个函数execle、execve就可以在envp[]中指定当前进程所使用的环境变量替换掉该进程继承的所以环境变量。