在使用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”表示在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; }