execvp,重定向ls的输出

时间:2014-10-01 17:19:07

标签: shell operating-system execvp

我正在尝试用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;

1 个答案:

答案 0 :(得分:0)

来自ls的错误告诉您已将>作为参数传递给ls

让我们看一下你的execvp电话:

execvp(argv[0],argv);

所以你使用整个argv作为产生ls的参数。

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

附注:您是否认为fopen会为新打开的文件分配stdout以前使用过的fd?这对我来说似乎是一个不明智的假设(即使它通常有效)。

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