Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/22.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
C ls:无法访问';路径=./';:没有这样的文件或目录_C_Linux_Exec - Fatal编程技术网

C ls:无法访问';路径=./';:没有这样的文件或目录

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

我对使用linux和bash命令行还不熟悉,但我试着看看是否可以从c文件执行基本的bash命令(或程序)。我的代码非常简单,我可以发誓它正在工作,但突然它不承认路径存在

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;
}

在参数列表的末尾需要一个空值。@dbush
char*environ[]={“PATH=。/”,NULL}我已经试过了,但它不起作用either@Lezcerchange
char*arg[]={“ls”,“-l”}
to
char*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;
}