我正在尝试用C语言为OS项目构建一个shell。当我做重定向部分时,问题就出现了。 ls
工作正常,但当我做ls > somefile
时。它给了我一个错误" ls:无法访问>:没有这样的文件或目录"。这是我的代码的一部分
while(in){
argv[c]=strdup(in); \\in is output of strtok applied on input string
in=strtok(NULL,"\n , ");
c++;
}
argv[c]=NULL;
int rc=fork();
if(rc==0){
int flag = 0;
int index = 0;
int i;
for(i= 0; i <c;i++)
{
if(strcmp(argv[i],">") == 0)
{
flag = 1;
index = i+1;
}
if(flag == 1)
{
fclose(stdout);
fopen(argv[index],"w+");
}
execvp(argv[0],argv);
}
else if(rc>0){
(void) wait(NULL);}
}
return 0;
答案 0 :(得分:0)
来自ls
的错误告诉您已将>
作为参数传递给ls
。
让我们看一下你的execvp
电话:
execvp(argv[0],argv);
所以你使用整个argv
作为产生ls
的参数。
在上述调用的处理中,您是否删除了您已经从argv
处理过的重定向参数,以便ls
看不到它们?
附注:您是否认为fopen
会为新打开的文件分配stdout
以前使用过的fd?这对我来说似乎是一个不明智的假设(即使它通常有效)。
哦,你的缩进可以使用一些工作。