对在shell中实现multipiping感到困惑

时间:2011-11-02 00:41:50

标签: c shell unix pipe

所以我一直在尝试在我自己的shell程序中实现管道,这样我才能真正理解UNIX正在做什么。我现在非常接近,但出于某种原因,当我管道时,我的程序将进入无限循环。我很确定我的问题源于我的waitpid参数,并没有让最后一个管道关闭,因为如果我在下面的代码中进行最后一个循环,那么我的数量小于数字-1而不是i小于数量它会运行管道左侧的命令。但是,一旦我把它归还给我,它就不足为数了。

           if(pipes)
                   {
            for (i=0;i<count-1;i++)
            {

                 if( pipe(fd) ==-1)
                 {
                 perror("Pipe failure");
                 return;
                 }

                read[i+1] = fd[0];
                write[i] = fd[1];
            }
        }

    for(i=0;i<count;i++)
    {
        pid = fork();

        if(pid < 0)
        {printf("fork failed");}

        else if(pid>0)
        {pids[i] = pid;}
        else
        { 
            if(write[i] != -1)
            {
                if(dup2(write[i],STDOUT_FILENO) ==-1)
                {
                perror("dup2 failure");
                exit(1);
                }
            }
            if(read[i] !=-1)
            {
                if (dup2(read[i], STDIN_FILENO)==-1)
                {
                perror("dup2 failure");
                exit(1);
                }
            }
        for (j=0; j<count; j++)
            {
            close(write[j]);
            close(read[j]);
            }

    execvp(input[i], input);
    exit(1);
        }//end else
    }//end for


  for(i=0; i < count; i++){


  if(write[i] != -1)
  close(write[i]);

  if( read[i] != -1)
  close (read [i]);

  waitpid(pids[i], &status,0);
 }
           }
    return (status);}

我认为我真的非常接近解决方案,但暂时我被卡住了。我已经研究了一吨,但我想我只是不太明白。谢谢你的帮助。

1 个答案:

答案 0 :(得分:1)

请格式化您的代码。现在这是不可读的。

话虽如此,但有一些错误:

  • 您没有设置write[0]。您正在设置write[count-1]read[count]
  • 当父母仍然pids[i]打开时,您正在等待read[i]。如果input[i]想要在stdin上获得EOF之前不会退出,那么它将永远不会发生。