C ls:无法访问';路径=./';:没有这样的文件或目录
我对使用linux和bash命令行还不熟悉,但我试着看看是否可以从c文件执行基本的bash命令(或程序)。我的代码非常简单,我可以发誓它正在工作,但突然它不承认路径存在C ls:无法访问';路径=./';:没有这样的文件或目录,c,linux,exec,C,Linux,Exec,我对使用linux和bash命令行还不熟悉,但我试着看看是否可以从c文件执行基本的bash命令(或程序)。我的代码非常简单,我可以发誓它正在工作,但突然它不承认路径存在 char* arg[] = {"ls", "-l"}; char* environ[] = {"PATH=./", (char*)0}; execve("/bin/ls", arg, environ);/*execute the command 'l
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
,但仍然不起作用。在arg数组的末尾放NULL
char* arg[] = {"ls", "-l", NULL};
空值用于标记数组的结尾。此错误消息
。。。指示ls
实用程序正在尝试访问名为“PATH=./”的文件,但找不到该文件。这是源于代码的未定义行为的表现
。。。由于execve()
期望并依赖于arg
指向的参数列表被空指针终止
尽管试图合理化或解释未定义的行为有些令人担忧,但您可以想象数组arg
和environ
的内容在内存中一个接一个地排列,因此,这两个元素的组合表示形式与char*
的四元素数组的表示形式相同。此视图可能有助于理解为什么必须首先用空指针终止arg
和env
数组
修复方法是向arg
的值附加一个空指针:
char* arg[] = {"ls", "-l", NULL};
还请注意,在这种特殊情况下,指定环境没有明显的优势,因此可以使用execv()
来简化
还要注意的是,除了
/
本身之外的路径元素不应包含尾随/
字符。这不是目录正确名称的一部分,尽管您经常可以不使用它,但它的形式很差。请始终发布完整的程序
正如手册页中所述,以及上面的评论中所述,在参数列表的末尾需要一个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;
}
#包括
#包括
内部主(空)
{
char*arg[]={/bin/ls',“-l”,NULL};
execve(“/bin/ls”,arg,NULL);
返回0;
}
在参数列表的末尾需要一个空值。@dbushchar*environ[]={“PATH=。/”,NULL}代码>我已经试过了,但它不起作用either@Lezcerchangechar*arg[]={“ls”,“-l”}
tochar*arg[]={“ls”,“-l”,NULL}
它报告了什么错误?@chepner,我想报告的错误在这个问题的标题中给出了。更多解释:没有NULL
,execve
有效地连接了两个数组,因为它不知道停止从内存读取。它看到ls
,它看到-l
,然后它看到PATH=/bin
,然后它看到NULL
。(行为未定义,但实际上这两个数组是在相邻的内存单元中分配的。)
char* arg[] = {"ls", "-l", NULL};
#include <stdio.h>
#include <unistd.h>
int main(void)
{
char* arg[] = { "/bin/ls", "-l", NULL };
execve("/bin/ls", arg, NULL);
return 0;
}