C Minishell Pipelines hinzufügen

Also mache ich eine UNIX-Minischale und versuche, Pipelines hinzuzufügen, damit ich Folgendes tun kann:

ps aux | grep dh | grep -v grep | cut -c1-5

Ich habe jedoch Probleme, meinen Kopf um den Rohrleitungsteil zu wickeln. Ich ersetze alle "|" Zeichen mit 0, und führen Sie dann jede Zeile als normale Zeile. Ich versuche jedoch, die Ausgabe und die Eingabe umzuleiten. Die Eingabe eines Befehls muss die Ausgabe des vorherigen Befehls sein, und die Ausgabe eines Befehls muss die Eingabe des nächsten Befehls sein.

Ich mache dies mit Pipes, kann aber nicht herausfinden, wo pipe () aufgerufen und wo sie geschlossen werden sollen. Von der Hauptverarbeitungsfunktion processline () habe ich diesen Code:

if((pix = findUnquotChar(line_itr, '|')))
{
    line_itr[pix++] = 0;
    if(pipe (fd) < 0) perror("pipe");
    processline(line_itr, inFD, fd[1], pl_flags);
    line_itr = &(line_itr[pix]);

    while((pix = findUnquotChar(line_itr, '|')) && pix < line_len)
    {
        line_itr[pix++] = 0;
        //? if(pipe (fd) < 0) perror("pipe");
        processline(line_itr, fd[0], fd[1] pl_flags);
        line_itr = &(line_itr[pix]);
    //? close(fd[0]);
    //? close(fd[1]);
    }
    return;
}

Daher sende ich rekursiv (der obige Code befindet sich in der Prozesszeile) die Befehle zwischen dem "|" von processline verarbeitet werden. Sie können sehen, wo ich den obigen Code auskommentiert habe. Ich bin mir nicht sicher, wie ich das machen soll. Der 2. und 3. Parameter von processline sind inputFD und outputFD. Ich muss also einen Befehl verarbeiten, die Ausgabe in eine Pipe schreiben und dann processline beim nächsten Befehl erneut aufrufen. Diesmal ist jedoch die Ausgabe des vorherigen Befehls die Eingang. Dies scheint jedoch nicht zu funktionieren, da ich jedes Mal, wenn ich fd [0] schließe, die vorherige Ausgabe verliere. Brauche ich zwei separate Pipes, mit denen ich den Flip Flop hin und her drehen kann?

Ich habe nur Probleme zu sehen, wie dies mit einer einzelnen Pipe möglich ist, wenn ihr zusätzliche Informationen benötigt, fragt einfach. Hier ist die gesamte Processline-Funktion für den Fall, dass Sie einen Blick darauf werfen möchten:

http://pastebin.com/YiEdaYdj

BEARBEITEN: Wenn jemand ein Beispiel für eine Shell hat, die Pipelines implementiert, würde ich gerne einen Link zur Quelle haben. Bisher konnte ich auf Google keinen finden.

EDIT2: Hier ist ein Beispiel für meine missliche Lage:

echo a | echo b | echo c

Als erstes würde ich die Shell so nennen:

processline("echo a", 0, fd[1], flags);

....

processline("echo b", fd[0], NOT_SURE_GOES_HERE[1], flags);

....

processline("echo c", NOT_SURE_GOES_HERE[0], NOT_SURE_EITHER[1], flags);

Jedes von diesen tritt einmal pro Iteration auf, und wie Sie sehen können, kann ich nicht herausfinden, was für die Eingabe-Datei-Deskriptoren und die Ausgabe-Datei-Deskriptoren für die 2. und 3. Iteration (und so weiter) zu übergeben ist.

Antworten auf die Frage(1)

Ihre Antwort auf die Frage