用execve调用ls
下面的代码应该调用带有用execve调用ls,c,linux,unix,C,Linux,Unix,下面的代码应该调用带有excve的命令,因为某种原因,我没有打印当前目录的内容,但程序仍然返回“ok” 1#包括 2#包括 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如果(执行(“ls”、argv、env)) 7{printf(“ok\n”); 8 }
excve
的命令,因为某种原因,我没有打印当前目录的内容,但程序仍然返回“ok”
1#包括
2#包括
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如果(执行(“ls”、argv、env))
7{printf(“ok\n”);
8 }
9其他
10{printf(“不正常”);
11 }
12返回0;
13 }
execve在出现错误时返回-1,当在需要布尔值的上下文中使用时,其计算结果为true。但是,检查返回值没有意义,因为如果execve成功,它将不会返回
在这种情况下,它可能会失败,因为您没有提供“ls”的完整路径。对exec的调用在成功时不会返回。基本上,您可以用正在执行的程序替换调用程序
因此,如果您运行的代码超过了exec,则表示exec失败。我相信exec返回-1,这就是为什么最后打印ok。因为
execve
在成功时不会返回,很明显调用以某种方式失败了。它在出错时返回-1,这将被视为true(非零)。这就是为什么它说可以
最可能的原因是您没有指定可执行文件的完整路径,这是
execve
的要求。或者,如果要搜索路径,请使用execvpe
。有关血淋淋的详细信息,请参见。这没有多大意义
if(execve("ls",argv,env) >0) {
printf("ok\n");
} else {
printf("not ok\n");
}
所有exec
函数如果成功都不会返回,因此如果返回,则表示失败,您不需要检查它是否返回-1
,第二个问题是execve()
的第一个参数是文件路径,而不是命令名,来自man:
execve()执行文件名所指向的程序
所以你只需要:
execve("/bin/ls", argv, env);
/* execve() only returns on error */
perror("execve");
exit(EXIT_FAILURE);
execve("/bin/ls", argv, env);
/* execve() only returns on error */
perror("execve");
exit(EXIT_FAILURE);