gpt4 book ai didi

c - execvp-ls : fts_open: No such file or directory

转载 作者:行者123 更新时间:2023-12-02 05:08:25 25 4
gpt4 key购买 nike

我目前正在为这个错误而苦苦挣扎。我正在编写一个 shell 模拟器,使用 fork() 来执行使用 execvp(); 的命令。除了没有参数的 ls 之外,我尝试解析到我的 shell 的几乎每个命令都运行良好。如果我尝试执行 ls -lah,一切正常,但简单的 ls 不会,收到以下错误:

ls: fts_open: No such file or directory

这是我的代码片段:(只是必要的)

pid = fork();
if (pid==0)
{
puts("CHILD");
puts(args[0]);
puts(args[1]);
printf("%d\n", strlen(args[1]));
args[2] = NULL;
execvp(args[0], args);
}
else wait(NULL);
puts("BACK TO PARENT");
}

这是 ls 的输出:

ls
CHILD
ls

0
ls: fts_open: No such file or directory
BACK TO PARENT

如您所见,args[0] 包含 ls,args[1] 为空,因为没有参数,args[1] 的长度为 0,但我一直收到错误。

知道它可能是什么吗?

编辑:

感谢 Jonathan Leffler 发现了它:(另外,这似乎只是 Mac 上的一个问题)

关键是 args[1] 并不是真正的空,因此,操作系统试图打开 '' 文件,显然,该文件不存在,并且从外观上看,无法创建,因为这不是一个真正的名字。

所以,这就是我所做的:检查 args[1] 的长度。如果为 0,则将其设置为 NULL。 (只是释放内存并没有真正帮助)

pid = fork();
if (pid==0)
{
puts("CHILD");
puts(args[0]);
puts(args[1]);
if (strlen(args[1]) == 0)
args[1] = 0;
args[2] = NULL;
execvp(args[0], args);
}
else wait(NULL);
puts("BACK TO PARENT");
}

最佳答案

如果没有更多参数,指针应该为空,而不是指向零长度字符串的非空指针。

pid = fork();
if (pid==0)
{
puts("CHILD");
puts(args[0]);
fflush(stdout);
args[1] = 0;
execvp(args[0], args);
fprintf(stderr, "Failed to exec %s\n", args[0]);
exit(1);
}
else
wait(NULL);
puts("BACK TO PARENT");

出于纯粹的好奇心,我在命令行尝试了这个:

$ ls ''
ls: fts_open: No such file or directory
$

您也在 Mac 上运行吗? (说我惊讶地看到相同的消息并不能开始描述我的 react !)更有趣的是,创建文件 fts_open 似乎并没有消除错误消息。 ls 的奇怪行为,但响应无效请求(没有文件名是空字符串)。

关于c - execvp-ls : fts_open: No such file or directory,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15892722/

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