【发布时间】:2013-03-31 08:08:10
【问题描述】:
我目前正在努力解决这个错误。我正在编写一个 shell 模拟器,使用 fork() 执行使用 execvp(); 的命令。 几乎我尝试解析到我的 shell 的每个命令都运行良好,除了没有参数的 ls 。 如果我尝试执行 ls -lah,一切正常,但简单的 ls 不会,收到以下错误:
ls: fts_open: No such file or directory
这是我的代码的 sn-p:(只是必要的)
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");
}
【问题讨论】:
-
您能否展示
args的完整定义(args[1]设置为什么,什么是“空”?),以及您的更多代码?