UNIX-Pipes Zwischen Kind-Prozesse

Ich versuche, ein Programm zu schreiben, das wird erzeugen eine beliebige Anzahl von Kind-Prozessen und Rohr zwischen Ihnen, ähnlich einer Befehlszeile pipeline. In meinem Fall bin ich versucht zu tun, "ls -l | more" und Ausgabe auf stdout, dann haben die Eltern weiterhin das ausführen mehrere Befehle.

Habe ich den folgenden code als ein minimal-Beispiel:

int main (int argc, const char * argv[]) {
    int fd[2];
    pipe(fd); 
    chdir("/directory/with/lots/of/files");

    //Create one child process for more
    int pid = fork();
    if (pid == 0) {
        close(fd[1]);
        int ret = dup2(fd[0],0);
        if (ret < 0) perror("dup2");
        char *argv[10];
        argv[0] = "more";  argv[1] = NULL;
        execvp("more", argv);
    } 
    //Create another child process for ls
    int pid2 = fork();
    if (pid2 == 0) {
        int ret = dup2(fd[1],1);
        if (ret < 0) perror("dup2");
        char *argv[10];
        argv[0] = "ls";    argv[1] = "-l";   
        argv[2] = NULL;
        execvp("ls", argv);
    }

    //wait for the more process to finish
    int status;
    waitpid(pid, &status, 0);

    printf("Done!\n");
    return 0;
}

Nun, wenn ich das Programm auszuführen (eingeschlossen in eine main () - Funktion natürlich), was ich am Ende mit mehr, die zu erwarten ist. Ich werde drücken Sie "d", um Seite nach mehr Leistung und "u" zu gehen, und es scheint gut zu funktionieren. Aber wenn ich den Boden erreichen, statt beenden wie nicht mehr, es bleibt nur eine leere Zeile. Strg-C funktioniert, um zu beenden, aber er beendet das ganze Programm, was den "Fertig!" - Zeile wird nie gedruckt. Ein Film hier, die zeigt, was passiert (beachten Sie, dass am Ende drücke ich Strg-C, um wieder zur bash).

Irgendwelche Gedanken zu dieser? Ich versuche nur, um herauszufinden, wie zu ändern, um, wo zu gehen, anstatt um eine leere Zeile nach mehr den Boden erreicht, mehr beendet und kehrt zum übergeordneten Prozess und es kann weiter ausgeführt werden.

  • Überprüfen, um zu sehen, ob more ist ein symlink auf less. Weniger muss -e zu beenden am Ende der Datei. Es ist möglich, dass es einen Unterschied in der PATH im Programm, der die Umgebung im Vergleich zu Ihrer interaktiven Umgebung.
  • Das ist es nicht, aber danke für das heads-up. Dass nur ich eine weitere test-Fall. 🙂
InformationsquelleAutor Justin Mrkva | 2011-02-20
Schreibe einen Kommentar