Name
Froschpopo the one and Only !
Das Problem
Der Aufruf von system() blockiert das Programm weil es auf einen Rückgabewert wartet.
Diagnose
Häufig kommt es vor, insbesondere bei Tk-Programmen stellt es ein Problem dar, dass man aus einem laufenden Prozess einen Systemcall absetzen will, dieser jedoch das laufende Programm blockiert. Dies kann man wahlweise mit system(), exec oder qx´´ machen.
system() wartet immer bis das aufgerufene Programm einen Status zurückgibt. Dies geschieht dann, wenn das aufgerufene Programm beendet wird. Dieses 'Warten' würde das aufrufende Programm solang blockieren, wie das aufgerufene Programm noch läuft.
exec() würde den Systemcall zwar absetzen, jedoch anschließend das Programm beenden.
Die einzigen verbleibenden Möglichkeiten sind: Threads, fork's oder verschiedene Events. Unter Tk gibt es z.B. das fileevent, Win32::Progress etc.
Leider funktionieren die wenigsten der o.g. Lösungen auf allen Betriebssystemen. Ich habe alle erfolgslos mit Windows Xp getestet.
Da mir Win32::Progress zu kompliziert ist (ich bin ein bequemer Mensch), möchte ich euch hier meine einfache Lösung vorstellen um ein Non-Blocking Systemcall zu realisieren, mit einem bisher noch recht unbekanntem Modul: Proc::Background
use Proc::Background;
my $proc1 = Proc::Background->new("explorer http://test.net");
print "hier gehts direkt ohne Verzögerung weiter\n";
Die in der perldoc beschriebenen Argumente werden nach dem Command-Arg übergeben nach dem folgendem Syntax:
Proc::Background('command', argv1, argv2....)
Viel Spaß damit!
Ergänzungen, Kommentare
Kommentare werden am besten in folgender Form vorgenommen, damit
sie im Inhaltsverzeichnis angezeigt werden (natürlich ohne das <verbatim>):
---### Main.??? - 14 Jul 2003 - Betreff