2016-05-31 5 views
0

Ich ging durch einige Bash-E/A-Tutorials, aber die meisten von ihnen betreffen das Umleiten von Stream zu/von Dateien.Konstruieren Rohrtopologie w/Schleifen, gemeinsame Senke

Ich möchte eigene Pipes machen (benannt oder nicht benannt), verwenden Sie Dateideskriptoren und verwenden Sie sie, um mehrere Programme oder Skripte zu verbinden, so dass sie miteinander reden.

Zum Beispiel ein Beispiel einer Topologie zur Verfügung zu stellen dies sollte konstruieren können:

  • program1 schreibt program2 und program3 und erhält von program2
  • program2 program1 und program3 schreibt und empfängt von program1
  • Programm3 wird nur von Programm1 und Programm2 empfangen.

So konstruiert die Topologie sollte wie folgt aussehen:

prog1 <-----> prog2 
    \  /
     \ /
     \ /
     \/
     V 
     prog3 
+0

Ziel zu verwenden ist nummerierte Dateideskriptoren – tomtom

+1

"Schreibt zu Programm2 und Programm3" - über eine einzelne FD, die zu beiden oder separat, mit ihnen möglicherweise unterschiedliche Ausgabe bekommen? –

+0

Dies scheint nicht wesentlich anders als Ihre [vorherige Frage] (http://stackoverflow.com/q/37549212/1126841). – chepner

Antwort

1

Eine Topologie wie diese ein bisschen schwierig ist, aber es ist möglich, wenn Sie benötigen, um Ihre schreibt nicht synchron zu sein.


Ich empfehle dringend zu vermeiden etwas Missions-kritisch auf diese Art von Praxis hängen.

mkfifo prog3_in # create a named pipe 
exec 5<>prog3_in # open read/write: this handle will be inherited by subprocesses, allowing 
       # the two tees to both write to the same stream 

mkfifo prog1_out 
mkfifo prog2_out 

# at minimum the first program must be opened in the background, since opening prog1_out 
# for write will hang until a reader is available 
prog1 5>&- <prog2_out | tee /dev/fd/5 >prog1_out & 
prog2 5>&- <prog1_out | tee /dev/fd/5 >prog2_out & 
prog3 <&5 5>&- & 

exec 5>&- # parent shell: close FD 5 
wait  # ...and wait for children to exit. 

tee oder ein Äquivalent ist in jedem Fall erforderlich, wenn ein einzelner Schreib in mehreren read s führen ist: jedoch auf jedem Betriebssystem, in dem /dev/fd zur Verfügung steht, so etwas wie die folgenden getan werden kann. (tee selbst liest von stdin, und schreibt dann auf jeden angegebenen Ausgang).


Das heißt, wenn Sie Ihre Programme mit dieser Topologie im Auge aufgebaut sind, schreiben sie nur Named Pipe Namen als Argumente zu nehmen, und lassen Sie die Schale aus ihm heraus:

prog1 --prog1-pipe=pipe1 --prog2-pipe=pipe2 --prog3-pipe=pipe3.1 
prog2 --prog1-pipe=pipe1 --prog2-pipe=pipe2 --prog3-pipe=pipe3.2 

# just make prog3 responsible for reading from *both* output pipes 
prog3 pipe3.1 pipe3.2 
Verwandte Themen