Frage

Nach dem Einbau Ben Voigt Antwort in den Code, es scheint zu funktionieren

Original Frage:

Ich versuche zu verwenden dup2 zu:

  1. passieren die Ausgabe von "ls -al" als Eingabe für "grep foo",
  2. , dessen Ausgang wird Eingang für "grep bar",
  3. , die schließlich auf die Standardausgabe ausgibt.

Der endgültige Ausgang ist (leer), wird die Datei „in“ ist (leer) und die Datei „out“ hat die Ausgabe von „ls -al“.

Alle Ideen, was könnte passieren?

int main()
{
    pid_t pid;
    int i;
    int inFileDes,outFileDes;   
    inFileDes=open("in",O_RDWR | O_CREAT,S_IRUSR | S_IWUSR); 
    outFileDes=open("out",O_RDWR | O_CREAT,S_IRUSR | S_IWUSR);  
    for(i=0;i<3;i++)
    {   
        if((pid=fork())==0)
        {
            switch(i)
            {
                case 0:
                dup2(outFileDes,1);
                execl("/bin/ls","ls","-al",0);
                break;
                case 1:
                                                  // originally:
                dup2(outFileDes,0);   // dup2(outFileDes,1);  
                dup2(inFileDes,1);    // dup2(inFileDes,0);

                execl("/bin/grep","grep","foo",0);   //lines having foo
                break;
                case 2:
                dup2(inFileDes,0);
                execl("/bin/grep","grep","bar",0);  //lines having foo & bar
                break;
            }
            exit(-1);  //in error   
        }
        waitpid(pid,NULL,0);
    }
    close(inFileDes);
    close(outFileDes);
    return(0);
}
War es hilfreich?

Lösung

Ihr open Aufruf erzeugt eine leere Datei „in“ und keines der Programme schreiben, um es, so dass erwartet wird. Da beide Instanzen von grep aus einer leeren Datei zu lesen, ist ihre Leistung auch leer.

Was Sie wirklich wollen, ist die pipe Funktion zu verwenden, um ein Paar zu bekommen Griffe, die ein Programm geschrieben werden und von den nächsten lesen. Sie müssen es zweimal nennen, weil Sie zwei Sätze von Verbindungen zwischen Child-Prozesse haben.

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