1.exec函数族
linux系统中有一系列的函数可以将一个进程的执行流程从一个可执行程序转移到另一个可执行程序。即装载并运行一个程序。这些函数称为exec函数族:
使用exec函数并不是创建新的进程,只是用了一个全新的程序替换了当前进程的正文段,数据,堆和栈。
函数原型:
#include <unistd.h>
int execl(const char *path, const char *arg, ...);
参数:path被执行的程序名(完整的路径),arg1-argn:是被执行程序所需的命令行参数,含程序名,以空指针NULL结束。
如例子:
#include <unistd.h>
int main()
{
execl("/bin/ls","ls","/",NULL);
return 0;
}
实现列出根目录下的文件。
int execv(const char *path, char *const argv []);
参数:path被执行的程序的名(含完整路径),argv[]是被执行的所需要的命令行参数数组。
如例子:
#include <unistd.h>
int main()
{
char * argv[] = {"ls","/",(char*)0};
execv("/bin/ls",argv);
return 0;
}
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[]);
exec函数的区别:
(1)前四个区路径名作为参数,后两个则是文件名
(2)与参数传递有关。execl、execlp以及execle要求将新程序的每个命令行参数(command-line arguments)都指定为一个单独的参数,以NULL指针表明参数的结束。另外三个函数(execv、execvp和execve),首先须要建立一个指向各参数的指针数组,然后将该数组的地址作为这三个函数的参数。
(3)与向新程序传递环境变量有关。以e结尾的两个函数(execle和execve)可以传递一个指向环境字符串指针数组的指针。其他四个函数则调用进程中的environ变量为新进程复制现有的环境。
上面几个函数用法类似,只是有小的差别。
参数说明:
参数argc指出命令行参数个数,数组argv存放所有命令行参数,数组envp存放所有的环境变量。环境变量一般是以字符串“XXX=xxx”的形式存在的,XXX表示变量名,xxx表示变量的值。我们常见的是PATH环境变量。
argv和envp数组存放的都是指向字符串的指针,这两个数组都以一个NULL元素表示数组结尾。
举个例子,不如使用execve函数,第一个参数path是被执行的应用程序的完整路径,第二个参数argv参数就是传递给应用程序的命令行参数(可执行文件的名字),第三个是传递给应用程序的环境变量。
exec函数族的关系:
这6个函数中,通常只有execve是内核的系统调用,另外5个是库函数,最终需要调用该系统调用。
例子参看linux代码。