Schrift
[thread]11402[/thread]

Systemaufruf, kehrt nicht zurück (Seite 2)

Leser: 1


<< |< 1 2 >| >> 16 Einträge, 2 Seiten
heihon
 2008-03-18 12:16
#107173 #107173
User since
2006-09-15
15 Artikel
BenutzerIn
[default_avatar]
Ich habe unter Windows folgendes versucht:

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#!/usr/bin/perl -w
#-----------------------------------------------------------------------------

use strict;

my $cmd = 'perl -e "sleep 1;print STDOUT qq(Hallo 1),$/;print STDERR qq(Hallo 2),$/"';
my $text = "$cmd 2>&1";
my $return;

sub mit_system {
    eval {
        local $SIG{ALRM} = sub { die "alarm\n" };       # NB \n required
        alarm 2;
        $return = system($text);
        alarm 0;
    };
    die if $@ && $@ ne "alarm\n";       # propagate errors
    if ($@) {
        # timed out
        print "\n\$\@ = $@\ntimeout, return: $return\n";
    }
    else {
        # didn't
        print "\nreturn: $return\n";
    }
}

sub mit_qx {
    eval {
        local $SIG{ALRM} = sub { die "alarm\n" };       # NB \n required
        alarm 2;
        $return = qx($text);
        alarm 0;
    };
    die if $@ && $@ ne "alarm\n";       # propagate errors
    if ($@) {
        # timed out
        print "\n\$\@ = $@\ntimeout, return: $return\n";
    }
    else {
        # didn't
        print "\nreturn: $return\n";
    }
}

mit_system();

mit_qx();

Wenn Du für den Programmaufruf
Code: (dl )
system()
verwendest, erhältst Du den Fehlercode, den das Programm liefert, als Ergebnis. Wenn es keinen Fehler gibt, erhältst Du die 0 (Null).

Wenn Du für den Programmaufruf
Code: (dl )
qx()
verwendest, erhältst Du die Ausgabe des Programmes (das, was das Programm nach STDOUT bzw. in die Konsole schreibt) als Ergebnis. Ich nehme an, dass Du eher an Letzterem interessiert bist.
theresa
 2008-03-26 14:56
#107504 #107504
User since
2007-07-17
90 Artikel
BenutzerIn
[default_avatar]
Ok, ich drehe gleich durch.

Habe folgenden Abschnitt jeweils mit system, qx und `` ausführen lassen, unten die Ergebnisse.
Alarm habe ich erstmal übertriebene 15 Sekunden gegeben, um sicherzustellen, dass keine Probleme auftauchen weil der Befehl nicht vollständig ausgeführt werden konnte.

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 eval {
local $SIG{ALRM} = sub { die "alarm\n" }; # NB \n required
alarm 15;
# $return = system($text);
# $return = qx($text);
$return = `$text 2>&1`;
alarm 0;
};
die if $@ && $@ ne "alarm\n"; # propagate errors
if ($@) {
# timed out
print "\n\$\@ = $@\ntimeout, return: $return\n";
}
else {
# didn't
print "\nreturn: $return\n";
}


(Die richtige Eingabe ist der Fall, wenn das Programm nicht zurückkommt, bei falschen Daten kommt es sofort zurück mit einer Fehlermeldung.)

-system/richtige Eingabe: timeout (wie erwartet), return leer (wie erwartet), also alles o.k.
-system/falsche Eingabe: kein timeout, fehlermeldung wird auf der konsole ausgegeben und Fehlerkode in $return gespeichert.
:( Häufiger aber timeout (?), selbe fehlermeldung auf der konsole, $return leer.

-qx/richtige Eingabe: kein timeout, bleibt hängen. Scheint also auf alarm nicht zu reagieren.
-qx/falsche Eingabe: kein timeout, und speichert die ausgabe in $return sowie erwartet, also hier auch alles o.k.

-``/richtige Eingabe: kein timeout, bleibt hängen. Scheint also auf alarm nicht zu reagieren.
-``/falsche Eingabe: timeout, und speichert nichts in $return.
renee
 2008-03-26 14:59
#107505 #107505
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Welches Windows? Welche Perl-Version?
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
theresa
 2008-03-26 15:00
#107506 #107506
User since
2007-07-17
90 Artikel
BenutzerIn
[default_avatar]
Windows XP prof und perl 5.8.8 ..
theresa
 2008-03-26 15:07
#107507 #107507
User since
2007-07-17
90 Artikel
BenutzerIn
[default_avatar]
Trick :D

Code: (dl )
1
2
3
4
5
6
7
8
eval {
local $SIG{ALRM} = sub { die "alarm\n" }; # NB \n required
alarm 15;
$return = system($text);
$return = qx($text);
# $return = `$text 2>&1`;
alarm 0;
};


Das funktioniert, wenn Fehler mit system auftaucht, wirds noch mal mit qx ausgeführt und gespeichert, sonst wird system unterbrochen und qx wird nicht ausgeführt.
theresa
 2008-03-26 15:09
#107508 #107508
User since
2007-07-17
90 Artikel
BenutzerIn
[default_avatar]
ist zwar nicht schön, aber in meinem Fall zumindest ist kein Problem den Befehl zwei Mal auszuführen
<< |< 1 2 >| >> 16 Einträge, 2 Seiten



View all threads created 2008-03-03 15:45.