exec ersetzt den momentan aktiven Prozess mit
dem angegebenen Programm. Das Skript
exec "ls" p "Ruby wird diese Zeile nie anzeigen".
liefert als Ausgabe
CVS cond_var.rb~ non_mutex.rb~ access_log f3.rb portscan.rb ... cond_var.rb non_mutex.rb tcpserver.rb~ armin@linux:~/rubybuch/rubybuch/beispiel_code >
Möchte man nach dem Start des externen Prozesses noch
weiter arbeiten, kann man mit fork einen neuen
Prozess erzeugen.
Dieser neue Prozess hat anfänglich exakt den gleichen
Zustand wie sein Erzeuger, mit einem einzigen Unterschied.
Der Rückgabewert der Methode fork ist im Erzeuger
die Prozessnummer und im neuen Prozess nil. Die
wait-Methode der Klasse Process wartet, bis alle
vom aktuellen Prozess aus gestarteten Prozesse beendet
sind.
if fork
Process.wait
puts ">> ls ist fertig"
else
exec("ls")
puts ">> das war's"
end
liefert
CVS cond_var.rb~ non_mutex.rb~ ... cond_var.rb non_mutex.rb tcpserver.rb~ >> das war's >> ls ist fertig
Anstatt nur zu warten, kann man mit trap einen "`Signal
handler"' aufsetzen, der die beim Beenden eines erzeugten Prozesses
entstandene Systemnachricht verarbeitet.
trap("CLD") { # ChiLd Dead
pid=Process.wait
puts "Kind pid #{pid}: zu Ende"
exit
}
exec("df") unless fork
p "fertig"
Eine weitere Möglichkeit, einen Prozess auszuführen, bietet die
Methode system: Der übergebene Befehl wird in einer "`Subshell"'
ausgeführt, während das Ruby-Skript auf das Ende wartet. Der
Rückgabewert ist true, falls das Kommando gefunden und erfolgreich
ausgeführt worden ist; ansonsten false. Den Exit-Code des
Prozesses erhält man in der globalen Variablen $?.
Die letzte Variante sorgt dafür, dass die Ausgabe des externen Befehls
an das Ruby-Skript umgeleitet wird und dort weiter verarbeitet werden
kann, arbeitet aber ansonsten wie system.
uptime = `uptime` # oder %x(uptime) uptime #->" 5:31pm up 5 days, ..."