Schrift
[thread]12008[/thread]

Fehlervorsorge bei open an Pipe



<< >> 4 Einträge, 1 Seite
RalphFFM
 2008-06-12 21:17
#111001 #111001
User since
2006-11-16
258 Artikel
BenutzerIn
[Homepage] [default_avatar]
Gegeben seien folgende zwei kleinen Skripte (Prinzipdarstellung):
Code (perl): (dl )
1
2
3
4
5
6
7
8
#!/usr/bin/perl
# eins.pl
use strict;
use warnings;
open (FH, '|-', "./zwei.pl") or die ("Kann zwei.pl nicht oeffnen: $!");
print FH "Einen schönen Gruss von Skript1\n";
close FH;
print "eins.pl ist zuende\n";

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
#!/usr/bin/perl
# zwei.pl
use strict;
use warnings;
$crash = "irgendetwas";  # <-- hier fehlt ein my ..
my ($input);
{
        undef $/;
        $input = <STDIN>;
}
print "$input\n";


Frage 1: Wieso die-ed eins.pl nicht, obwohl das Kompilieren+Ausführen von zwei.pl fehlschlägt?
(w/ use strict in Zusammenhang mit dem $crash ohne my)
Falls zwei.pl nur aus dem einen Befehl "die;" besteht, dann kann ich das Verhalten von eins.pl ja noch verstehen, STDIN wird halt dann einfach nicht aufgefangen. Aber daß open innerhalb eins.pl kein Problem hat wenn zwei.pl noch nicht mal ausgeführt werden kann, dann kann man ja wichtige Fehler nicht mehr abfangen mittels "or die ..". Denn was nützt es wenn zwar /usr/bin/perl ausgeführt werden kann aber das Skript nicht?

Frage 2: Wie könnte man in eins.pl registrieren, daß zwei.pl nicht ausgeführt werden kann, und somit auch die Datenübergabe natürlich scheitert?
Gast Gast
 2008-06-12 21:55
#111003 #111003
murphy
 2008-06-13 01:29
#111007 #111007
User since
2004-07-19
1776 Artikel
HausmeisterIn
[Homepage]
user image
Es ist hier ja nicht so, dass beim Starten des Subprozesses ein Fehler auftreten würde, folglich greift auch die Fehlerabfrage bei open nicht.

Der Fehler tritt vielmehr erst später auf, während der Subprozess schon läuft. Um festzustellen, wann das passiert, sollte man auch nach print und close prüfen, ob diese I/O-Operationen erfolgreich waren, oder ob die Pipe bereits "tot" ist.

Wenn man ferner den Rückgabestatus des aufgerufenen Programmes abfragen will, muss man CPAN:IPC::Open2 oder CPAN:IPC::Open3 und -f waitpid benutzen.

Wenn man auch die Fehlermeldung auf STDERR abfangen will, so geht das mit CPAN:IPC::Open3.
When C++ is your hammer, every problem looks like your thumb.
renee
 2008-06-13 10:28
#111009 #111009
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
murphy+2008-06-12 23:29:46--
Wenn man auch die Fehlermeldung auf STDERR abfangen will, so geht das mit CPAN:IPC::Open3.


Dabei sollte man beachten, dass kein Filehandle für STDERR erzeugt wird. Siehe auch http://rt.perl.org/rt3/Public/Bug/Display.html?id=...
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/
<< >> 4 Einträge, 1 Seite



View all threads created 2008-06-12 21:17.