2012-04-13 14 views
4

Fast alle pipe Beispiele, die ich Beratung gesehen habe schließen die unbenutzte Schreib/Lese endet. Auch Mann sagt eindeutig, dass pipe() creates a pipe, a unidirectional data channel Aber ich habe versucht, zu lesen und zu beiden Enden des Rohres sowohl im Elternteil als auch im Kind zu schreiben, und alles scheint in Ordnung zu sein.Warum kann eine mit der Funktion pipe() erstellte Pipe nicht als bidirektionale Pipe verwendet werden?

Also meine Zweifel ist, warum brauchen wir 2 Rohre, wenn zwei Prozesse müssen beide lesen und miteinander zu schreiben und warum nicht tun Sie es mit einem einzigen Rohr?

+1

Weil die Leute, die zuerst pipe() implementierten, es unidirektional machten, das dann ein Standard für nachfolgende Implementierungen wurde. (Beachten Sie, dass bei einigen Betriebssystemen pipe() Ihnen einen bidirektionalen Stream gibt, während andere dies nicht tun). Verwenden Sie einfach 2 Pipes oder verwenden Sie socketpair(), wenn Sie eine bidirektionale Kommunikation benötigen. – nos

+0

Die Jungs, die zuerst Rohr() eingeführt haben, statteten die Rohrleitung mit nur einem einzigen Puffer aus, der echten Rohren für die Förderung von Flüssigkeiten/Gasen ähnlich ist. Für Dual-Puffer, siehe Sockets. –

+0

Solaris-Rohre sind bidirektional. Nicht dass eine ganze Menge Leute Solaris mehr benutzen ... einfach nur da rausschmeißen. Wie andere jedoch klarstellten, sollten Sie, wenn Sie Portabilität wünschen, diese Fähigkeit nicht übernehmen. – FatalError

Antwort

8

Wenn Sie das gleiche Rohr verwenden, wie das Kind seine Nachrichten von den Eltern-Nachrichten und umgekehrt trennt sich?

Zum Beispiel:

Parent writes to pipe 
Parent reads from pipe hoping to get message from child but gets its own message :(

Es ist viel einfacher, ein Rohr für kinder-> Eltern und ein weiteres Rohr für Eltern-> Kind zu verwenden.

Selbst wenn Sie ein Protokoll zum Lesen/Schreiben haben, ist es relativ einfach, den Eltern- und Kindprozess zu blockieren.

+0

diese QA sollte der Kontext sein, wenn Sie Einführung in was Rohre überhaupt sind ... – n611x007

5

Sie kann Lese- und Schreib an beiden Enden des Rohres angelegt, aber unidirektional bedeutet, dass Daten nur in eine Richtung bewegt jederzeit, von den Eltern auf Kinder oder vice versa. Für das blockierungsfreie Senden und Empfangen von Daten werden zwei Pipes benötigt, dh Sie können mit zwei Pipes gleichzeitig lesen und schreiben, aber mit einer Pipe müssen Sie das Lesen beenden, bevor Sie in die Pipe schreiben können oder Sie müssen etwas schreiben bevor Sie die Pfeife lesen können. In Laiebezeichnungen, können Sie nur an jedem Punkt der Zeit lesen oder schreiben mit nur einem Rohr

+0

danke! Ich bin neu hier, unsicher über die Formatierung –