next up previous contents index
Search Next: rb_spread Up: Ein Ruby-Client/Server-1x1 Previous: Monitore   Contents   Index

Datenaustausch per Pipeline

Ruby-Prozesse können über Sockets (siehe Abschnitt 19.5) oder Pipes miteinander kommunizieren. Pipes sind auf Unix-Systemen das Standardverfahren, wenn es darum geht, Aus- und Eingabe zweier Programme miteinander zu verknüpfen, ohne eine temporäre Datei anlegen zu müssen.

Im Beispiel erzeugt der laufende Prozess mit fork eine (anfangs identische) Kopie, die sich nur darin unterscheidet, dass der fork-Aufruf im Vaterprozess die Prozessnummer des erzeugten Kinds zurückgibt, im Kindprozess dagegen nil.

puts "Papa: Wo sind meine Daten?"
rd, wr = IO.pipe
if fork
  # Vater
  wr.close
  puts "Papa: Ich habe '#{rd.read}' verstanden"
  rd.close
  Process.wait
else
  # Kind
  rd.close
  puts "Kind: Hier"
  wr.write "Hier"
  wr.close
  exit
end

Process.wait wartet auf das Ende aller erzeugten Kindprozesse.

Pipes sind normalerweise bidirektional, können also sowohl zum Senden als auch zum Empfangen von Daten verwendet werden.

vater2kind_rd, vater2kind_wr = IO.pipe
kind2vater_rd, kind2vater_wr = IO.pipe

if fork
  kind2vater_wr.close
  vater2kind_wr.print "Hallo Kind"
  vater2kind_wr.close
  puts "Vater: got <#{kind2vater_rd.read}>"
  kind2vater_rd.close
  Process.wait
else
  vater2kind_wr.close
  puts "Kind: got <#{vater2kind_rd.gets}>"
  vater2kind_rd.close
  kind2vater_wr.write "Hallo Vater"
  kind2vater_wr.close
  exit
end



(C) 2002 by dpunkt.de, Armin Roehrl, Stefan Schmiedl, Clemens Wyss 2002-01-20