2014-10-01 31 views
0

我想在C语言中为OS项目构建一个shell。当我做重定向部分时,问题即将到来。 ls工作正常,但是当我做ls > somefile。它给我一个错误“ls:can not access>:没有这样的文件或目录”。这里是我的代码部分execvp,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

该错误从ls是告诉你,你传给>ls作为参数。

那么,让我们看看你的execvp电话:

execvp(argv[0],argv); 

所以,你正在使用的argv全部作为参数传递给催生ls

其中,在上面的处理中,您是否从argv中删除了已经处理的重定向参数,以便ls看不到它们?

附注:你是否假设fopen将分配你刚打开的文件fd先前由stdout使用?这对我来说似乎是一个不明智的假设(即使它通常有效)。

哦,你的缩进可以使用一些工作。

+0

我想我看到了问题。我没有删除重定向参数。是的,我假设fopen会将描述符1分配给新文件。我不知道如何以其他方式做到这一点。 @Eten Reisner – 2014-10-01 17:46:41

+0

@AnmolYousaf查看['man fopen'](http://linux.die.net/man/3/fopen),那里有另外一个对你有用的功能。也可能是['man dup'](http://linux.die.net/man/3/dup)。 – 2014-10-01 17:49:56

+0

谢谢@EtanReisner – 2014-10-01 17:53:57