Frage

I haben verrohrt erfolgreich die Ausgabe eines Befehls in den Eingang des anderen und zeigen dann die Ausgabe des zweiten Befehls auf den Bildschirm.

Ich möchte diese aufeinanderfolgende Befehle mit drei zu tun. (Eigentlich schließlich will ich es tun mit N in das Programm zur Laufzeit übergeben Befehle.

Dies ist mein Versuch, Pipelining drei Befehle zusammen.

AKTUALISIERT: i aktualisierte meine Frage meinen letzten Versuch zu reflektieren.

    #include <string.h>
    #include <fstream>
    #include <iostream>
    #include <unistd.h>
    #include <stdio.h>
    #include <sys/wait.h>
    #include <sys/types.h>
    using namespace std;

    int main(int argc, char * argv[])
    {
             pid_t pid;
        int pfd[2];
        char* prgname = NULL;
        if(pipe(pfd) == -1)
        {
                perror("error on pipe call");
                return(1);
        }
        for(int j = 0;j<numberOfCommands;j++)
        {
                cout<<commands[j]<<"_"<<endl;
        }
        pid = fork();
        if(pid == 0){//child process
                close(pfd[0]); //close read end of pipe
                dup2(pfd[1],1);//connect the pipes
                close(pfd[1]);//close extra file descriptors
                prgname = (char*)"dmesg"; //commands[0];//first command
                execlp(prgname, prgname, 0);//Load the program
        }
        else
        {
                int pfd2[2];
                if(pipe(pfd2) == -1)
                {
                        perror("error on pipe call 2");
                        return(1);
                }
                pid = fork();
                if(pid == 0)//child
                {
                        close(pfd[1]);
                        dup2(pfd[0],0);
                        close(pfd[0]);
                        close(pfd2[0]);
                        dup2(pfd2[1],1);
                        close(pfd2[1]);
                        prgname = (char*)"sort";
                        execlp(prgname,prgname,0);
                }
                else
                {
                close(pfd2[1]); //close the write end of the pipe
                dup2(pfd2[0],0);//connect the pipes
                close(pfd2[0]); //close extra file descriptor
                prgname = (char*)"more"; //commands[1];//now run the second command
                execlp(prgname, prgname, 0);//Load the program
                }
        }
        return 0;
}

Ich habe hart alle Werte der Einfachheit halber codiert. Das Programm zeigt, welche die Ausgabe von „dmesg | mehr“ sein sollten, aber nicht die Art Teil tun und dann friert. Ich sehe das Betteln von dmesg und mehr in den linken unteren, aber ich nicht mehr sehen kann.

Irgendwelche Ideen?

War es hilfreich?

Lösung

pipe(2) bietet nur 2 Filedeskriptoren für 1 Rohr. Der 3. Dateideskriptor (pfd[2]) ist Junk und wird nie initialisiert zu werden. Wenn Sie eine Pipeline mit drei Befehle darin erstellen möchten, müssen Sie pipe() zweimal anrufen zwei Rohre zu bekommen: eine für die ersten und zweiten Verfahren verbindet, und eine für den zweiten und dritten Prozesse verbinden

.
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top