对比C语言中execv相关的执行文件的三个函数
C语言execv()函数:执行文件函数
头文件:
#include<unistd.h>
定义函数:
intexecv(constchar*path,char*constargv[]);
函数说明:execv()用来执行参数path字符串所代表的文件路径,与execl()不同的地方在于execve()只需两个参数,第二个参数利用数组指针来传递给执行文件.
返回值:如果执行成功则函数不会返回,执行失败则直接返回-1,失败原因存于errno中.
错误代码:请参考execve().
范例
/*执行/bin/ls-al/etc/passwd*/ #include<unistd.h> main() { char*argv[]={"ls","-al","/etc/passwd",(char*)}; execv("/bin/ls",argv); }
执行:
-rw-r--r--1rootroot705Sep313:52/etc/passwd
C语言execve()函数:执行文件函数
头文件:
#include<unistd.h>
定义函数:
intexecve(constchar*filename,char*constargv[],char*constenvp[]);
函数说明:execve()用来执行参数filename字符串所代表的文件路径,第二个参数系利用数组指针来传递给执行文件,最后一个参数则为传递给执行文件的新环境变量数组.
返回值:如果执行成功则函数不会返回,执行失败则直接返回-1,失败原因存于errno中.
错误代码:
EACCES:
1.欲执行的文件不具有用户可执行的权限.
2.欲执行的文件所属的文件系统是以noexec方式挂上.
3.欲执行的文件或script翻译器非一般文件.
EPERM:
1.进程处于被追送模式,执行者并不具备root权限,欲执行的文件具有SUID或SGID位.
2.欲执行的文件所属的文件系统是以nosuid方式挂上,欲执行的文件具有SUID或SGID位元,但执行者并不具有root权限.
E2BIG参数数组过大
ENOEXEC无法判断欲执行文件的执行文件格式,有可能是格式错误或无法在此平台执行.
EFAULT参数filename所指的字符串地址超出可存取空间范围.
ENAMETOOLONG参数filename所指的字符串太长.
ENOENT参数filename字符串所指定的文件不存在.
ENOMEM核心内存不足
ENOTDIR参数filename字符串所包含的目录路径并非有效目录
EACCES参数filename字符串所包含的目录路径无法存取,权限不足.
ELOOP过多的符号连接
ETXTBUSY欲执行的文件已被其他进程打开而且正把数据写入该文件中
EIOI/O存取错误
ENFILE已达到系统所允许的打开文件总数.
EMFILE已达到系统所允许单一进程所能打开的文件总数.
EINVAL欲执行文件的ELF执行格式不只一个PT_INTERP节区
EISDIRELF翻译器为一目录
ELIBBADELF翻译器有问题.
范例
#include<unistd.h> main() { char*argv[]={"ls","-al","/etc/passwd",(char*)0}; char*envp[]={"PATH=/bin",0}; execve("/bin/ls",argv,envp); }
执行:
-rw-r--r--1rootroot705Sep313:52/etc/passwd
C语言execvp()函数:执行文件函数
头文件:
#include<unistd.h>
定义函数:
intexecvp(constchar*file,char*constargv[]);
函数说明:execvp()会从PATH环境变量所指的目录中查找符合参数file的文件名,找到后便执行该文件,然后将第二个参数argv传给该欲执行的文件。
返回值:如果执行成功则函数不会返回,执行失败则直接返回-1,失败原因存于errno中.
错误代码:请参考execve()。
范例
/*请与execlp()范例对照*/ #include<unistd.h> main() { char*argv[]={"ls","-al","/etc/passwd",0}; execvp("ls",argv); }
执行:
-rw-r--r--1rootroot705Sep313:52/etc/passwd