3

下面的代码应该调用一个命令,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

4 回答 4

4

由于execve不返回成功,很明显调用以某种方式失败。它在错误时返回 -1,这将被视为真(非零)。这就是为什么它说好的。

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

于 2012-11-21T14:00:46.157 回答
2

对 exec 的调用在成功时不会返回。您基本上将调用程序替换为您正在执行的程序。

因此,如果您曾经通过 exec 运行任何代码,则意味着 exec 失败。我相信 exec 返回 -1,这就是你最终打印正常的原因。

于 2012-11-21T13:58:48.203 回答
2

这真的没有多大意义

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);
于 2012-11-21T14:03:51.543 回答
1

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

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

于 2012-11-21T13:56:40.227 回答