Ist es möglich, die pipe zwischen zwei Kind-Prozesse erzeugt, die von gleichen Eltern (LINUX, POSIX)
Habe ich mehrere Kind "- Gabel", die von den gleichen Eltern, und ich versuche zu konstruieren pipe
Verbindung zwischen all diese untergeordneten Prozesse wie eine verkettete Liste Struktur. Kind 1 sendet Daten an kind2, Kind 2 zu Kind 3.... Kind N Kind 1. Gibt es eine richtige Weg, es zu tun?
Zusätzlich, wenn ich erstellen und die Kommunikation zwischen Prozessen, wie Zwinge ich die Eltern zu "warten" alle den Prozess zu beenden Ihren job, da wait()
oder waitpid()
wartet auf die ersten fertigen Prozess, aber ich muss warten bis Sie alle. Es ist das eine andere Frage, die sich stellt.
Dank...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dies ist im wesentlichen, was eine shell hat, wenn Aufbau einer Kette Umleitung, d.h. so etwas wie
Gibt es einige ausgezeichnete introducionary Texte auf Unix-Programmierung, in denen eine einfache shell implementiert ist, durch das Buch. Und eine der Aufgaben einer shell-Umleitung. Eines dieser Bücher ist "Linux-Anwendungs-Programmierung" von Michael K. Johnson und Erik W. Troan.
Buch-homepage: http://ladweb.net/
Bauen eine Kette von Umleitungen für N Prozesse, die Sie brauchen, N-1-Leitungen. Für jede Umleitung, die Sie erstellen eine pipe mit den
pipe(int fds[2])
system nennen. Nachfork()
ing, aber vorexecv
ing verwendendup2(int from, int to)
zu "verbinden", um eine pipe ' s end, um die standard-Eingabe (0) oder standard-output eines jeden Prozesses. Hier ist eine allzu vereinfachte code, ohne Fehler zu überprüfen:Beachten Sie, dass das Rohr der array-Indizes wurden so gewählt, dass Sie spiegeln die standard-Eingabe/Ausgabe, file-Deskriptoren, falls Sie verwendet werden, für die stdio-Umleitung. Diese Wahl war nicht willkürlich.
Natürlich können Sie verbinden die Rohre, um eine Datei-Deskriptoren (z.B. gibt es einige Anwendungen, die erwarten, dass Ihre Eltern zu öffnen, zu sagen, fd 3 und 4, mit Rohren) und die meisten Muscheln direkt unterstützt dies auch (zum Beispiel 1>&3 umleiten von stdout in fd 3). Aber die array-Indizes für
pipe(int fds[2])
sind 0 und 1 natürlich. Ich bin einfach nur gesagt, weil ich hatte einige cargo-cult-programming-Studierende, die gedankenlos nahm der Gegner fds auch für die Rohr-syscall-array.Warten für alle Kinder zu beenden, verwenden Sie
waitpid(-1, NULL, 0)
– ich denke, das ist der -1 meinem vor-Beantworter gemeint, das bedeutet: Warten Sie, bis alle Kind-Prozesse zu beenden. Die andere option war die Berufungwait()
in einer Schleife wird wieder die pid des beendeten Kindes. Wenn wieder angerufen und es ist immer noch ein Kind läuft, wird es wieder sperren. Wenn dort kein Kind verließ, wird -1 zurück; ich bevorzuge diewaitpid
Lösung.exec…
ersetzt das Prozess-image. Alles, was nach derexec…
innerhalb der if-Anweisung wird nicht ausgeführt.Ja, das ist ziemlich einfach, Sie müssen nur zu erstellen, der alle Leitungen, die in der übergeordneten und denken Sie daran, schließen Sie die Rohre /enden der Rohre in den Kind(ern), die Sie nicht brauchen.
Verlassen FDs-Rohren, öffnen von bei Kindern, die nicht mit Ihnen ist ein SCHEITERN, wie es machen kann die andere ewig warten, bis das Ende des Rohres. Alle Autoren, die geschlossen werden müssen, bevor der Leser bekommt ein EOF.
Erstellen alle Rohre zuerst, dann spawnen alle Kinder mit den entsprechenden Rohrenden in FDs 0 und 1.
Als für das warten, einfach weiter warten, bis es wieder -1.