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 aufless
. Weniger muss-e
zu beenden am Ende der Datei. Es ist möglich, dass es einen Unterschied in derPATH
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. 🙂
Du musst angemeldet sein, um einen Kommentar abzugeben.
Müssen Sie
close()
zumindest das schreiben Ende der Leitung, sonstmore
nie sehen EOF. Zum Beispiel:close(fd[0])
nach derdup2()
im ersten Kindes, und ebenso fürfd[1]
in dem zweiten Kind.close(fd[0]);
in dem zweiten Kind), aber ich hätte nie gedacht, schließen Sie Sie auf die Eltern zu Ende. Nach der Suche ein bisschen tiefer fand ich den Kommentar "Nach der Gabel, die Sie haben ein Rohr mit zwei Eingängen und zwei Ausgängen", das macht Sinn in diesem Zusammenhang. Danke! EDIT: Yep, caf, als ich entdeckte, dass als ich im Begriff war, über Sie, aber ich weiß schließen Sie Sie in der Fertigungsversion. 🙂Ich denke, es ist, weil der
wait() function
. Nach der Logik, das zweite Kind der Prozess-outputs auf das erste Kind-Prozess, D. H. es sollten am Ende der ersten als der zweiten.In Ihrem
wait
Funktion sind Sie warten auf den ersten Prozess zu beenden, aber Sie werden nicht warten, für den zweiten Prozess. Das bedeutet, dass, wenn der zweite Prozess nicht senden ein EOF an den Ausgang je, Ihre ersten Prozess nicht das Ende, denke ich.Können Sie versuchen Sie warten, bis der zweite Prozess statt, der das erste und finden Sie heraus, ob das ist das problem.