Können Pipes in UNIX bidirektional arbeiten?

7

Sehen Sie sich den folgenden Code an:

%Vor%

Nun, hier habe ich nur eine Pipe erstellt, aber beide Prozesse können lesen und schreiben. Sind Rohre nicht unidirektional? Auch, wenn ich die konventionelle 'close (pipdes [0])' für Eltern und 'close (pipdes [1])' für Kind, der Code funktioniert nicht, obwohl ich die offene Funktion (pipdes [0]) hinzufügen später.

Meine Konzepte mit UNIX und Pipes sind immer noch roh, also könnte ich hier ein bisschen lahm kommen, aber bitte helfen Sie mir.

    
Utumbu 05.12.2011, 19:36
quelle

3 Antworten

16

Bei einigen Systemen können Rohrleitungen bidirektional sein. Aber das müssen sie nicht sein, und jede Annahme, dass sie sein werden, ist nicht portabel. Insbesondere sind sie nicht auf Linux.

So wie es ist, hat Ihr Code ein Problem - beide Prozesse versuchen, von derselben Pipe zu lesen und in dieselbe zu schreiben. Die beabsichtigte Verwendung für Pipes ist, dass das Kind schreibt und das übergeordnete Element liest oder umgekehrt. Die aktuelle Art, wie du Dinge machst, funktioniert gerade für dich, weil du einmal liest und schreibst und wait ing auf das Kind setzt. Aber wenn Sie eine Schleife machen, während Sie versuchen, die Dinge so zu machen, wie Sie es tun, können Sie nicht wait - und ohne Synchronisierung wird das Kind oft (aber nicht immer!) Am Ende lesen, was es an den Elternteil senden wollte und umgekehrt.

Wenn Daten in beide Richtungen fließen sollen, können Sie zwei Paare von Pipes verwenden. Nennen wir sie parent_pipe und child_pipe . Das übergeordnete Element liest von parent_pipe[0] und schreibt nach child_pipe[1] , und das untergeordnete Element liest von child_pipe[0] und schreibt nach parent_pipe[1] .

%Vor%

Alternativ können Sie ein Paar UNIX-Sockets verwenden, die mit socketpair(AF_LOCAL, SOCK_STREAM, 0, sockdes) erstellt wurden (wobei sockdes das ist, was wir in pipdes umbenannt haben, da es jetzt Sockets und keine Pipes sind). Das Kind würde von sockdes[0] lesen und schreiben, und das Elternteil würde lesen und in sockdes[1] schreiben. Oder umgekehrt.

    
cHao 05.12.2011, 19:49
quelle
4

In POSIX.1-2001 sind Pipes unidirektional. Von der Manpage:

  

pipe () erstellt ein Paar Dateideskriptoren, die auf einen Pipeinode verweisen.   und platziert sie in dem Array, auf das die Dateien zeigen. filedes [0] ist für   Lesen, Filedes [1] ist zum Schreiben.

Übrigens ist Ihre Verwendung von fork falsch: fork gibt pid>0 für die Eltern und pid==0 für die untergeordnete Person zurück. pid<0 bedeutet, dass ein Fehler aufgetreten ist.

    
Klox 05.12.2011 20:15
quelle
2

Nein, sind sie nicht. Es gab einige Systeme mit ihnen (Sonne, IIRC). Wenn Sie wirklich eine bidirektionale Leitung benötigen, können Sie socketpair () verwenden.

    
wildplasser 05.12.2011 20:09
quelle

Tags und Links