[英]ls: cannot access 'PATH=./': No such file or directory
I'm new to using linux and the bash command line but I was trying to see whether I could execute basic bash commands (or program) from a c file. 我的代码非常简单,我可以发誓它正在工作,但突然间它甚至不承认路径存在。
char* arg[] = {"ls", "-l"};
char* environ[] = {"PATH=./", (char*)0};
execve("/bin/ls", arg, environ);/*execute the command 'ls -l' in curdir*/
我试图设置为PATH=/bin
但它甚至没有执行该目录中的命令。 它只是返回一个类似的错误。
注意:我已经尝试过
char* environ[] = {"PATH=./", NULL};
我什至尝试过使用 main() 中的envp
,但仍然无法正常工作。
将 NULL 放在 arg 数组的末尾。
char* arg[] = {"ls", "-l", NULL};
NULL 用于标记数组的结束。
此错误消息...
ls: cannot access 'PATH=./': No such file or directory
... 表示ls
实用程序正在尝试访问名为“PATH=./”的文件,但它没有找到该文件。 这是您的代码引起的未定义行为的表现......
char* arg[] = {"ls", "-l"}; char* environ[] = {"PATH=./", (char*)0}; execve("/bin/ls", arg, environ);/*execute the command 'ls -l' in curdir*/
...由于execve()
期望并依赖于arg
指向的参数列表,该参数列表被 null 指针终止。
虽然试图合理化或解释未定义的行为有点令人担忧,但您可以想象 arrays arg
和environ
的内容在 memory 中紧挨着一个接一个地布置,因此这两者的组合表示与表示相同char *
的四元素数组。 这个视图可能有助于理解为什么arg
和env
arrays 首先必须由 null 指针终止。
修复是 append 指向arg
值的 null 指针:
char* arg[] = {"ls", "-l", NULL};
另请注意,在这种特殊情况下,指定环境没有明显优势,因此您可以改用execv()
来简化。
还要注意,除/
本身之外的路径元素不应包含尾随/
字符。 这不是正确的目录名称的一部分,尽管您通常可以侥幸逃脱,但它的形式很差。
请始终发布完整的程序。
如手册页中所述,以及上述评论中所述,您需要NULL
列表末尾的 NULL。
您不需要在envp[]
中传递任何内容,因为您只运行ls
按照惯例,您应该在argv[0]
中传递可执行文件的完整路径
简而言之,这行得通
#include <stdio.h>
#include <unistd.h>
int main(void)
{
char* arg[] = { "/bin/ls", "-l", NULL };
execve("/bin/ls", arg, NULL);
return 0;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.