Thread Prozessid eines mit system ausgeführten befehls (8 answers)
Opened by mordur at 2007-08-06 18:24

sid burn
 2007-08-07 00:33
#97683 #97683
User since
2006-03-29
1520 Artikel
BenutzerIn

user image
@RPerl
Grrrr....

Also ich erkläre das Beispiel mal etwas genauer:
Code (perl): (dl )
1
2
system('ls -l');
print "Hallo, Welt!\n";


In den oberen Mini Stück code wird zuerst ein system() aufgerufen. Dieses ruft "ls -l" auf. Und jetzt kommt der knackpunkt. Wärenddessen läuft dein Perl Programm nicht weiter! Ein aufruf von system() führt dazu das dein komplettes Programm solange stehen bleibt bis das Kommando ausgeführt wurde und sich beendet, erst danach fährt dein Perl Programm fort.

Wenn du anstatt "ls -l" jetzt "gimp" aufrufst, und du 3 Stunden lang ein Bild in gimp malen würdest, dann würde dein Programm auch 3 Stunden lang warten bis gimp beendet ist.

Wenn es jetzt Möglich wäre und du würdest wirklich die PID heraus bekommen für system() welchen Nutzen hat dir diese PID dann noch? Kurz gesagt gar kein. Du magst dann die PID haben, aber der Prozess mit dieser PID existiert schon lange nicht mehr. Das einzige was du ausgeben könntest wäre: "Ich habe ein Process mit der PID $PID erzeugt. Allerdiengs existiert dieser Process nicht mehr, von daher ist diese Information sowieso unbrauchbar".

Und da so eine Ausgabe unbrauchbar ist, ist mir kein weg bekannt die PID von einem system() Befehl heraus zu bekommen. Zumal es sowieso keinen Sinn macht diese zu Wissen.

Das was höchstens von Interesse wäre, wäre z.B. der Rückgabewert des Programmes, damit kann man dann Prüfen ob das Programm erfolgreich gelaufen ist, oder nicht. Der Rückgabewert steht in der Specialvariable $?.

Wenn er die Rückgabe des Programmes lesen möchte, wäre der qx() Operator das richtige. Möchte er einen Prozess starten und die Ausgabe Parallel abarbeiten, dann das Beispiel von betterworld.

Es kann aber immer noch Beispiele geben wo all das unbrauchbar ist. Unter umständen können dann Module wie IPC::Open2 oder IPC::Open3 helfen, oder man macht händisch alles mit fork(). Allerdiengs muss der Threadersteller erstmal wieder genauer erklären was er überhaupt machen möchte.
Nicht mehr aktiv. Bei Kontakt: ICQ: 404181669 E-Mail: perl@david-raab.de

View full thread Prozessid eines mit system ausgeführten befehls