next up previous contents index
Search Next: Threads (leichtfüßig) Up: Prozesse und Threads Previous: Prozesse und Threads   Contents   Index

Prozesse (schwergewichtig)

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, ..."


next up previous contents index
Search Next: Threads (leichtfüßig) Up: Prozesse und Threads Previous: Prozesse und Threads   Contents   Index
(C) 2002 by dpunkt.de, Armin Roehrl, Stefan Schmiedl, Clemens Wyss 2002-01-20