所以我一直在尝试在我自己的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);}
我认为我真的非常接近解决方案,但暂时我被卡住了。我已经研究了一吨,但我想我只是不太明白。谢谢你的帮助。
答案 0 :(得分:1)
请格式化您的代码。现在这是不可读的。
话虽如此,但有一些错误:
write[0]
。您正在设置write[count-1]
和read[count]
。pids[i]
打开时,您正在等待read[i]
。如果input[i]
想要在stdin上获得EOF之前不会退出,那么它将永远不会发生。