ls: 无法访问 'PATH=./': 没有那个文件或目录
ls: cannot access 'PATH=./': No such file or directory
我刚开始使用 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
但它甚至没有执行该目录中的命令。它只是 returns 一个类似的错误。
注意:我试过了
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
指向的参数列表被空指针终止。
虽然试图合理化或解释未定义的行为有点令人担忧,但您可以想象数组 arg
和 environ
的内容在内存中一个接一个地排列,所以这两者的组合表示与 char *
的四元素数组的表示相同。此视图可能有助于理解为什么 arg
和 env
数组必须首先由空指针终止。
修复方法是将空指针附加到 arg
的值:
char* arg[] = {"ls", "-l", NULL};
另请注意,在这种特殊情况下,指定环境没有明显优势,因此您可以改用 execv()
来简化。
还要注意,/
本身以外的路径元素不应包含尾随 /
字符。这不是目录的正确名称的一部分,虽然您通常可以不用它,但它的格式很差。
请总是post一个完整的程序。
如手册页和上面的评论所述,您需要在参数列表末尾添加一个 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;
}
我刚开始使用 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
但它甚至没有执行该目录中的命令。它只是 returns 一个类似的错误。
注意:我试过了
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
指向的参数列表被空指针终止。
虽然试图合理化或解释未定义的行为有点令人担忧,但您可以想象数组 arg
和 environ
的内容在内存中一个接一个地排列,所以这两者的组合表示与 char *
的四元素数组的表示相同。此视图可能有助于理解为什么 arg
和 env
数组必须首先由空指针终止。
修复方法是将空指针附加到 arg
的值:
char* arg[] = {"ls", "-l", NULL};
另请注意,在这种特殊情况下,指定环境没有明显优势,因此您可以改用 execv()
来简化。
还要注意,/
本身以外的路径元素不应包含尾随 /
字符。这不是目录的正确名称的一部分,虽然您通常可以不用它,但它的格式很差。
请总是post一个完整的程序。
如手册页和上面的评论所述,您需要在参数列表末尾添加一个 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;
}