perlunity.de - PERL | JAVASCRIPT | PHP | MySQL | APACHE



#!/COMMUNITY

Members: 5374
davon online: 1
weitere User: 36
Click for quality!




10.02.2012 / 09:56

Community-Member werden   |   Paßwort vergessen   |   OnlineMonitor (1) Wer ist online ... OnlineMonitor starten !
     

 

Home


PERLscripts


PHPscripts


JAVAscripts


Hilfreiches


Links2www


Newscenter


Community


Interna




Community  »  Perl: Allgemeines Forum zur Themenübersicht Themensuche Themenansicht in Thread-Modus


Beitragsystem() und Rückgabe
Seitenanfang
Hallo,
ich bin relativ verwirrt was die Rückgabe von system() angeht...
Wenn ich z.B. folgendes ausführe:

system("ls -la") == 0 or
die "Exit due to fatal error: $?, $!\n";

... bekomme ich die Ausgabe von "ls -la" (o.k.)
allerdings bricht das Skript dann ab mit:
Exit due to fatal error: -1, No child processes

Wieso denn -1?? Ich dachte, 0 würde die fehlerfreie Ausführung von Unix Befehlen anzeigen..? Oder ist -1 jetzt die Rückgabe von wait() - wieso ist das "ls -la" dann kein Kind Prozess??
Verstehe ich alles nicht,
bitte um Erleuchtung!

Datum: 03.11.2005-15:31

Beitragre: system() und Rückgabe
Seitenanfang
Jaja, ist schon richtig.

Der Prozess gibt 0 zurueck wenn alles OK war. 0 ist boolean FALSE, also greift das or und das die() wird ausgefuehrt.

system() and die $!;

wird wohl das sein was Du willst. Ist zwar seltsam anzuschauen, aber sollte gehen.

Datum: 03.11.2005-23:22

Beitragre: system() und Rückgabe
Seitenanfang
Hi,

ein Systemaufruf ist kein Kindprozess, sodern ein Eigenständiger, der seinen Rückgabewert und etwaige Ausgaben an das Skript übergibt (piped). Es wird nicht geforkt! Deshalb hat $? auch den Wert -1.

Auch gibt es im Hinblick auf das benötigte Ergebnis verschiedene Varianten ihn zu verwenden.

Den Aufruf system("...") benutzt man, wenn man nur an dem Rückgabewert interessiert ist. Will man jedoch die Ausgabe eines Befehles haben nimmt man die Backticks.

Beispiel:


my $return_value = system("ls /root");

oder

my $files_list = `ls -lhtri`;

Die Verwendung von "or die" eignet sich hier eher weniger.

http://de.selfhtml.org/perl/funktionen/systemaufrufe.htm#system

-uw

Datum: 04.11.2005-10:44

Beitragre: system() und Rückgabe
Seitenanfang
Hmmm,
bin immer noch unsicher..

In Perl Programming:
-----
"The system function works exactly like exec, except that system does a fork first and then, after the exec, waits for the executed program to complete."
(...)
Check the return value from system to see whether the program you were running exited properly or not.

@args = ("command", "arg1", "arg2");
system(@args) == 0
or die "system @args failed: $?"
----

Unsinniges statement (==0) wenn system() immer
-1 zurückgibt, dann muss er immer die() nehmen ?!

Datum: 07.11.2005-09:39

Beitragre: system() und Rückgabe
Seitenanfang
Hi,

Du hast Recht, ich war da leider einem Irrtum unterlegen. Ich habe da in der Dokumentation etwas falsch verstanden oder schlichtweg überlesen. Es wird tatsächlich ein Kindprozess erzeugt.

Nun habe ich versucht Deinen Fehler zu reproduzieren, was mir aber leider nicht gelungen ist. Bei mir läuft dieses Konstrukt einwandfrei.


#!/usr/bin/perl -w

use strict;
use warnings;

my $ret_val = system("ls -la");

print "ret_val: $ret_val.\n\n";

system("ls -la") == 0 or
die "Exit due to fatal error: $?, $!\n\n.";

print "\$?: $?\n\n";

exit(0);

$ret_val enthält die Null und $? ebendso. Auch wird der print-Befehl noch ordentlich ausgeführt.

-uw

Datum: 07.11.2005-15:07

-






-
-