我正在努力解决这个错误。我正在编写一个shell模拟器,使用fork()来执行使用execvp();的命令。 几乎我尝试解析到我的shell的每个命令都工作得很好,除了没有参数的ls。 如果我尝试执行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]的len。如果为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");
}
答案 0 :(得分:5)
如果没有更多参数,则指针应该为null,而不是指向零长度字符串的非空指针。
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上运行? (说我很惊讶地看到同样的消息并未开始描述我的反应!)更有趣的是创建文件fts_open
似乎没有消除错误消息。 ls
的奇怪行为,但是响应无效请求(没有文件名是空字符串)。