用execve调用ls

时间:2012-11-21 13:53:21

标签: c linux unix

以下代码应该使用excve调用命令,因为某些原因我不打印当前目录的内容,但程序仍返回"ok"

  1 #include <stdio.h>
  2 #include <unistd.h>
  3 int main ()
  4 { char *argv[]={"ls",NULL};·
  5   char *env[]={"PATH=/usr/local/sbin/:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games",NULL};
  6   if(execve("ls",argv,env))
  7   { printf("ok\n");
  8   }
  9   else
 10   { printf("not ok\n");
 11   }
 12   return 0;
 13 }      

4 个答案:

答案 0 :(得分:3)

由于execve没有成功返回,很明显,呼叫以某种方式失败。它在错误时返回-1,这将被视为true(非零)。这就是它说好的原因。

最可能的原因是您没有指定可执行文件的完整路径,这是execve的要求。或者,如果要搜索路径,请改用execvpe。有关血腥的详细信息,请参阅http://linux.die.net/man/3/exec

答案 1 :(得分:2)

对exec的调用在成功时不会返回。你基本上用你要执行的程序替换调用程序。

因此,如果您经过exec运行任何代码,则意味着exec失败。我相信exec返回-1,这就是为什么你最终打印好了。

答案 2 :(得分:1)

execve在出错时返回-1,在需要布尔值的上下文中使用时,其值为true。但是,检查返回值没有意义,因为如果execve成功,那么它将不会返回。

可能在这种情况下,它失败了,因为你没有提供'ls'的完整路径。

答案 3 :(得分:1)

这没有多大意义

if(execve("ls",argv,env) >0) {
    printf("ok\n");
} else {
    printf("not ok\n");
}

如果成功,所有exec函数都不会返回,所以如果它返回则表示失败,你不需要检查它是否返回-1,第二个问题是第一个参数是execve()是文件路径而不是命令名,来自man:

  

execve()执行 filename 指向的程序。

所以你只需要:

execve("/bin/ls", argv, env);
/* execve() only returns on error */
perror("execve");   
exit(EXIT_FAILURE);