Domanda

Ho convogliato con successo l'output di un comando all'ingresso di un altro e poi mostrare l'uscita del secondo comando sullo schermo.

voglio fare questo con tre comandi successivi. (In realtà alla fine voglio farlo con N comandi inviati al programma in fase di esecuzione.

Questo è il mio tentativo di pipelining tre comandi insieme.

Aggiornamento: Ho aggiornato la mia domanda per riflettere il mio ultimo tentativo.

    #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;
}

Ho hard coded tutti i valori di semplicità. Il programma visualizza quello che dovrebbe essere l'uscita di "dmesg | more", ma non fa la parte di ordinamento e poi si blocca. Vedo l'accattonaggio di dmesg e più in basso a sinistra, ma non riesco a vedere più.

Tutte le idee?

È stato utile?

Soluzione

pipe(2) fornisce solo 2 descrittori di file per 1 tubo. Il descrittore di file di 3 ° (pfd[2]) è spazzatura e non è mai sempre inizializzato. Se si desidera creare una pipeline con 3 comandi in esso, è necessario chiamare pipe() due volte per ottenere due tubi: uno per il collegamento del primo e secondo processi, e uno per il collegamento del secondo e terzo processi

.
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top