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

UtilPerlSkripteSubForm edit

Titel Non-Blocking Systemcalls
Autor LucasMengel
Bereich PerlSkripteTk
Topic revision: 2006-05-06, TinaMueller
 
Bitte die NutzungsBedingungen beachten.
Bei Vorschlägen, Anfragen oder Problemen mit dem PerlCommunityWiki bitten wir um WebBottomBarExample">Rückmeldung.