gpt4 book ai didi

c - 使用 execv() 时没有这样的文件或目录

转载 作者:太空宇宙 更新时间:2023-11-04 01:02:17 25 4
gpt4 key购买 nike

我正在尝试编写一个基本的 shell,它可以用 c 语言解释简单的命令,例如 date、ls。

我首先像这样获取 PATH 变量,然后将其传递给 execv() 函数。

const char *name = "PATH";
char *value;
value = getenv(name)

然后我打印出这个值,我得到了这个:

/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games

请注意,我正在使用 virutalbox 来运行 Ubuntu。这是我用来尝试一个简单的 ls 命令的代码。在下面的代码中,变量行是用户编写的实际命令,在我们的例子中是“ls”

  pid_t pid, wpid;
int status;

pid = fork();
if (pid == 0) {
// Child process
if (execv(value, line) == -1) {
perror("lsh");
}
exit(EXIT_FAILURE);
}
else if (pid < 0) {
// Error forking
perror("lsh");
}
else {
// Parent process
do {
wpid = waitpid(pid, &status, WUNTRACED);
}
while (!WIFEXITED(status) && !WIFSIGNALED(status));
}

我得到的结果是这样的:

lsh: no such file or directory

有什么想法吗?

最佳答案

execv()系统调用使用您在第一个参数中指定的名称作为可执行文件的文件名;它不进行基于路径的搜索。

这意味着,如果您指定"lsh" 作为第一个参数,则当前目录中必须有一个可执行文件lsh

如果您想要基于 PATH 的搜索,请将 execv() 替换为 execvp()。否则,在第一个参数中指定命令的路径名——绝对路径或相对路径,但绝对路径更正常。

请注意,如果任何 exec*() 函数返回,则表明它失败了。无需测试返回值;它将始终为 -1。

valueline 的内容需要遵循:

char *value = "ls";
char *line[] = { "ls", "-l", 0 };

execvp(value, line);

或者,更传统地说:

execvp(line[0], line);

如果您自己分析 PATH,则需要让 line[0] 指向您从 PATH 创建的完整文件名,然后使用 execv () 而不是 execvp()

关于c - 使用 execv() 时没有这样的文件或目录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33813944/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com