Linux下exec函数族(execl,execv,execle,execve,execlp,execvp,fexecve)的使用和对比
exec函数是提供fork创建新的线程后,执行外部程序的一个接口,当进程调用一种exec函数时,该进程执行的程序完全替换为新程序,且从新程序的main函数开始执行。因为exec不创建新的进程,所以前后的进程ID不变。
1、int execl(const char * path,const char * arg0,.../* NULL */);
功能:
该函数可以将path指定的路径下的arg程序启动起来,从main函数开始执行
参数:
path要执行的可执行程序的路径+名称
arg0 要执行的可执行程序的第一个参数
... 可执行程序的参数arg1,arg2 ...,所有的参数最后必须以NULL结尾。
返回值:如果执行成功则函数不会返回, 执行失败则直接返回-1, 失败原因存于errno 中.
int execv(const char * path,char * const argv[]);
功能:同上
参数:
path 要执行的可执行程序的名称+路径
argv 要执行的程序的参数数组
返回值:如果执行成功则函数不会返回, 执行失败则直接返回-1, 失败原因存于errno 中.
int execle(const char * path,const char * arg0,.../* NULL */,char *const envp[] );
功能:同上
参数:
path 要执行的可执行程序的名称+路径
argv 要执行的程序的参数数组
envp 传递环境表信息environ,一个指向环境字符串指针的指针数组
返回值:如果执行成功则函数不会返回, 执行失败则直接返回-1, 失败原因存于errno 中.
int execve(const char * path,char * const argv[],char * const envp[]);
功能和参数 参考 execv execle
2、int execlp(const char *filename,const char * arg0,...);
功能:
直接给出程序的名称和参数即可调用启动。
参数:
filename要执行的可执行程序名称,从PATH环境变量中查找文件并执行
如果filename中包含/,则就将其视为路径名
否则就以PATH环境变量搜寻可执行文件
arg0 ...可执行程序的参数列表,想当与主函数传参中的argv[0]...;
返回值:如果执行成功则函数不会返回, 执行失败则直接返回-1, 失败原因存于errno 中.
int execvp(const char *filename,char * const argv[])
功能和参数 参考 execv execlp
3、int fexecve(int fd,char *const argv[],char *const envp[]);
功能:
以打开的程序文件描述符为启动程序
参数:
fd 要执行的可执行程序文件描述符
argv[] 可执行程序的参数数组
envp 传递环境表信息environ,一个指向环境字符串指针的指针数组
返回值:如果执行成功则函数不会返回, 执行失败则直接返回-1, 失败原因存于errno 中.
exec族函数名中 l 表示列表list,v 表示数组
execl、execlp、execle 将新程序的每个命令行参数都以一个单独的参数,这种参数列表以NULL结尾
execv、execvp、execve和fexecve 则应先构造一个指向各参数的指针数组,然后将该数组地址作为参数传入
exec族函数名中 p结尾表示函数第一个参数取filename
execlp、execvp与其他函数不同就是第一个参数取filename,并且用PATH环境变量寻找可执行文件
filename 既可以是文件路径加程序名,也可以是PATH环境变量下的 /sbin: /bin: /usr/bin: 即shell命令
exec族函数名中 e结尾表示可以传递环境表信息environ
execle、execve、fexecve 可以传递一个指向环境字符串指针数组的指针
下边是执行的一个例程
#include "head.h"
int main(int argc, const char *argv[])
{
pid_t pd;
printf("pid=%d ppid=%d\n",getpid(),getppid());
pd = fork();
if(pd == 0)
{
printf("pid=%d ppid=%d pd=%d\n",getpid(),getppid());
char cwdpath[64];
getcwd(cwdpath,sizeof(cwdpath));
printf("cwdpath:%s\n",cwdpath);
int ret = execl("./hello","user",NULL);
printf("execl return = %d\n",ret);
int ret = execlp("ls","-al",NULL);
printf("execl return = %d\n",ret);
exit(0);
}
wait(NULL);
printf("pid=%d ppid=%d pd=%d\n",getpid(),getppid());
return 0;
}
下边的是用exec链接的程序
#include <stdio.h>
int main(int argc, const char *argv[])
{
hello(argv[0]);
return 0;
}
int hello( const char *name)
{
printf("hello %s !\n",name);
return 0;
}