Итак, я пытался реализовать конвейер в моей собственной программе оболочки, чтобы я мог действительно понять, что делает UNIX.Я сейчас очень, очень близок, но по какой-то причине моя программа заходит в бесконечный цикл, когда я транслирую.Я почти уверен, что моя проблема проистекает из моих аргументов waitpid, которые не позволяют закрывать последний канал, потому что, если я сделаю последний цикл в приведенном ниже коде, то я буду меньше, чем count-1, а не меньше, чем count, он будет работатькоманда слева от трубы.Но как только я возвращаю его обратно, я меньше, чем считаю, он просто зацикливается навсегда.
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);}
Я думаю, что я действительно очень близок к решению, но на данный момент я застрял.Я исследовал тонну, но думаю, я просто не совсем понял.Спасибо за любую помощь.