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