以下代码应该使用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 }
答案 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);