Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用execve调用ls_C_Linux_Unix - Fatal编程技术网

用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);