在使用exec函数族的时候,经常搞不清楚这六个函数之间的区别,下面就总结一下这六个函数的区别。
#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[]);
要记住这六个函数之间的区别,就要搞清楚 “l” 、“v”、“p”、“e”代表的含义
“l”表示参数以列表的形式表示;
“v”表示参数以数组的形式表示;
“p”表示在PATH中搜索执行文件;
“e”表示可附加环境参数。
execlp、execvp这两个函数第一个形参是名为file表示可以只列出文件名就可以了,不用指出它的路径。
注意的地方有:
1、参数以NULL结尾;
2、exec函数族执行成功后不会返回,执行失败会返回 -1,错误代码存放在errno中
3、可能的几种错误有,找不到文件或路径,errno为ENOENT;数组argv或envp没有以NULL结尾,errno为EFAULT;没有对执行文件的执行权限,errno为EACCESS;
照例附加一段测试代码
#include <unistd.h>
int main(int argc,char** argv)
{
char* envp[] = {"PATH=/usr/bin","USER=admin",NULL};
char* argv_execv[] = {"echo","exec on execv",NULL};
char* argv_execvp[] = {"echo","exec on execvp",NULL};
char* argv_execve[] = {"echo","exec on execve",NULL};
if(fork() == 0)
{
if(execl("/bin/echo","echo","execut by execl",NULL) < 0)
{
perror("error on execl");
}
}
if(fork() == 0)
{
if(execlp("echo","echo","exec by execlp",NULL) < 0 )
perror("error execlp");
}
if(fork() == 0)
{
if(execle("/bin/echo","echo","execut by execle",NULL,envp) < 0)
{
perror("error on execle");
}
}
if(fork() == 0)
{
if(execv("/bin/echo",argv_execv) < 0)
{
perror("error on execv");
}
}
if(fork() == 0)
{
if(execvp("echo",argv_execvp) < 0)
{
perror("error on execvp");
}
}
if(fork() == 0)
{
if(execve("/bin/echo",argv_execve,envp) < 0)
{
perror("error on execve");
}
}
return 0;
}