当前位置:  技术问答>linux和unix

execve函数的问题

    来源: 互联网  发布时间:2015-12-08

    本文导语:  #include  #include  #include  #include  int main() {   if(fork()==0)   {     int i = execve("/bin/ls",0,0);     if(i==-1)     printf("Error!");   } } 请问这样为什么会出错呢? | execl(执行文件)  相关...

#include 
#include 
#include 
#include 

int main()
{
  if(fork()==0)
  {
    int i = execve("/bin/ls",0,0);
    if(i==-1)
    printf("Error!");
  }
}

请问这样为什么会出错呢?

|
execl(执行文件) 

相关函数 
fork,execle,execlp,execv,execve,execvp
表头文件 
#include
定义函数 
int execl(const char * path,const char * arg,....);
函数说明 
execl()用来执行参数path字符串所代表的文件路径,接下来的参数代表执行该文件时传递过去的argv(0)、argv[1]……,最后一个参数必须用空指针(NULL)作结束。
返回值 
如果执行成功则函数不会返回,执行失败则直接返回-1,失败原因存于errno中。
范例 
#include
 main()
 {
 execl(“/bin/ls”,”ls”,”-al”,”/etc/passwd”,(char * )0);
 }
执行 
/*执行/bin/ls -al /etc/passwd */
 -rw-r--r-- 1 root root 705 Sep 3 13 :52 /etc/passwd
 

 execlp(从PATH 环境变量中查找文件并执行) 
相关函数 
fork,execl,execle,execv,execve,execvp
表头文件 
#include
定义函数 
int execlp(const char * file,const char * arg,……);
函数说明 
execlp()会从PATH 环境变量所指的目录中查找符合参数file的文件名,找到后便执行该文件,然后将第二个以后的参数当做该文件的argv[0]、argv[1]……,最后一个参数必须用空指针(NULL)作结束。
返回值 
如果执行成功则函数不会返回,执行失败则直接返回-1,失败原因存于errno 中。
错误代码 
参考execve()。
范例 
/* 执行ls -al /etc/passwd execlp()会依PATH 变量中的/bin找到/bin/ls */
 #include
 main()
 {
 execlp(“ls”,”ls”,”-al”,”/etc/passwd”,(char *)0);
 }
 
执行 
-rw-r--r-- 1 root root 705 Sep 3 13 :52 /etc/passwd



 execv(执行文件) 
相关函数 
fork,execl,execle,execlp,execve,execvp
表头文件 
#include
定义函数 
int execv (const char * path, char * const argv[ ]);
函数说明 
execv()用来执行参数path字符串所代表的文件路径,与execl()不同的地方在于execve()只需两个参数,第二个参数利用数组指针来传递给执行文件。
返回值 
如果执行成功则函数不会返回,执行失败则直接返回-1,失败原因存于errno 中。
错误代码 
请参考execve()。
范例 
/* 执行/bin/ls -al /etc/passwd */
 #include
 main()
 {
 char * argv[ ]={“ls”,”-al”,”/etc/passwd”,(char*) }};
 execv(“/bin/ls”,argv);
 }
执行 
-rw-r--r-- 1 root root 705 Sep 3 13 :52 /etc/passwd


 execve(执行文件) 
相关函数 
fork,execl,execle,execlp,execv,execvp
表头文件 
#include
定义函数 
int execve(const char * filename,char * const argv[ ],char * const envp[ ]);
函数说明 
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 欲执行的文件已被其他进程打开而且正把数据写入该文件中
 EIO I/O 存取错误
 ENFILE 已达到系统所允许的打开文件总数。
 EMFILE 已达到系统所允许单一进程所能打开的文件总数。
 EINVAL 欲执行文件的ELF执行格式不只一个PT_INTERP节区
 EISDIR ELF翻译器为一目录
 ELIBBAD ELF翻译器有问题。
 
范例 
#include
 main()
 {
 char * argv[ ]={“ls”,”-al”,”/etc/passwd”,(char *)0};
 char * envp[ ]={“PATH=/bin”,0}
 execve(“/bin/ls”,argv,envp);
 }
 
执行 
-rw-r--r-- 1 root root 705 Sep 3 13 :52 /etc/passwd
 


 execvp(执行文件) 
相关函数 
fork,execl,execle,execlp,execv,execve
表头文件 
#include
定义函数 
int execvp(const char *file ,char * const argv []);
函数说明 
execvp()会从PATH 环境变量所指的目录中查找符合参数file 的文件名,找到后便执行该文件,然后将第二个参数argv传给该欲执行的文件。
返回值 
如果执行成功则函数不会返回,执行失败则直接返回-1,失败原因存于errno中。
错误代码 
请参考execve()。
范例 
/*请与execlp()范例对照*/
 #include
 main()
 {
 char * argv[ ] ={ “ls”,”-al”,”/etc/passwd”,0};
 execvp(“ls”,argv);
 }
执行 
-rw-r--r-- 1 root root 705 Sep 3 13 :52 /etc/passwd

    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • execv和execve在程序上的区别在哪里啊?
  • system和execv系列
  • 怎样用execve()运行一个在RAM中的可执行文件
  • fork, execv后 timer 失效
  • execv()??
  • 关于execv指令
  • 利用fork 与 dup2 执行 系统命令, 别的命令都可以获取执行结果,就fdisk 命令不可以. execve("/sbin/fdisk",args,NULL) , args 命令参数.
  • 急: 代码那里写错了??dup2 execve写的执行命令的程序, 重定向标准输入、输出、标准错误,无法获取到fdisk 的命令输出。别的命令都可以。附代码


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3