[Vienna-pm] symlink: Ungültiger Dateidescriptor

Calli gooly at gmx.at
Thu Jun 19 10:27:52 PDT 2008


Am Sonntag, 15. Juni 2008 schrieb Peter J. Holzer:
> On 2008-06-14 23:15:13 +0200, Calli wrote:
> > Am Samstag, 14. Juni 2008 schrieb Peter J. Holzer:
> > > On 2008-06-14 10:07:11 +0200, Calli wrote:
> > > > Am Samstag, 14. Juni 2008 schrieb Lars Dɪᴇᴄᴋᴏᴡ 迪拉斯:
> > > > > Wie soll man sich ein
> > > > > klares Bild über das Problem verschaffen?
> > > >
> > > > Das ist der etwas geänderte Funktionsaufruf (ich hatte
> > > > Funktionen):
> > > >
> > > >   $tstSL='/ir/gend/wo/tst'; # das dir gibt's und ist 'ganz
> > > > offen' (777) # ändere Pfad für $_[1] nicht Namen, für mit/ohne
> > > > Pfad foreach my $oF ( liesFiles('ir/gend/wo/files') ) {
> > > >    # für Files mit und ohne Pfad
> > > >     symlink($oF,$tstSL.(($oF =~ /.+\/(.+)/ ) ?  "/$1" :
> > > > "/$_[1]") ); next if ( $? || $! =~ /exist/ ); # kein Fehler,
> > > > wenn File exists.
> > >
> > > [...]
> > >
> > > > > Was mich stutzig macht: "Ungültiger Dateideskriptor" ==
> > > > > EBADF, aber das ist in man 2 symlink gar nicht aufgeführt.
> > > > > Überprüfst du Rückgabewerte auf die korrekte Art?
> > > >
> > > > Siehe oben mit $? und $!
> > >
> > > perldoc perlvar:
> > >
> > >        $?      The status returned by the last pipe close,
> > > backtick ("``") command, successful call to wait() or waitpid(),
> > > or from the system() operator.
> > >
> > >
> > > perldoc -f symlink:
> > >
> > >        symlink OLDFILE,NEWFILE
> > >                Creates a new filename symbolically linked to the
> > > old filename. Returns 1 for success, 0 otherwise.
> >
> > und ??
> > das (inkl man symlink) hab ich ja alles auch aufgerufen und 'fühle
> > mich' ratlos zurückgelassen:
>
> Ich hatte gehofft, Du würdest den Fehler sehen, wenn man Dir die zwei
> relevanten Sätze aus der Doku auf dem Silbertablett präsentiert. Aber
> offenbar kannst Du diese beiden Sätze nicht mit Deinem Code in
>
> Zusammenhang bringen. Also Schritt für Schritt:
> > > >     symlink($oF,$tstSL.(($oF =~ /.+\/(.+)/ ) ?  "/$1" :
> > > > "/$_[1]")
>
> 1) Wie stellst Du fest, ob symlink funktioniert hat? Gar nicht, denn
> in
>
>    der Doku steht:
> > > Returns 1 for success, 0 otherwise.
>
> Aber den Returnwert von symlink ignorierst Du. Richtig müsste das
> ungefähr so lauten:
>
>     unless (symlink($oF,$tstSL.(($oF =~ /.+\/(.+)/ ) ?  "/$1" :
> "/$_[1]"))) { # Fehlerbehandlung
>     }
ahh, ok! Ich kam vom einen system('..') aufruf, den ich dann änderte 
und ..
> > > > ); next if ( $? || $! =~ /exist/ ); # kein Fehler, wenn File
>
> 2) Was bedeutet »$?«?

> > >        $?      The status returned by the last pipe close,
> > > backtick ("``") command, successful call to wait() or waitpid(),
> > > or from the system() operator.
>
> Wieso interessiert Dich der "status returned by the last pipe close,
> ..." an der Stelle? Du willst wissen, ob symlink funktioniert hat,
> das ist weder ein pipe close, noch ein backtick command, noch ruft es
> wait, waitpid oder system auf. Also ist die Abfrage von $? an dieser
> Stelle bestenfalls wirkungslos, schlimmstenfalls fragst Du etwas
> vollkommen anderes ab als Du erwartest. Also weg damit.
die doku von symlink ist sehr sparsam, nicht auszuschließen, dass 
symlink intern ähnlich einem System-Aufruf (system('symlink', ..) 
realisiert ist, ausserdem hab ich mir eine Art Fehlerschrotschuß 
gemacht:
print "...  ?:$?; !:$!; err:".($? & 127),"<\n";

> > da wird ein Fehler gefunden, den 'gibt's-nicht'.
>
> Sowas ist immer ein guter Hinweis darauf, dass mit der Logik der
> Fehlerbehandlung was nicht stimmt.
Ähm, wirklich? Tatsächlich scheint symlink sehr wohl $! zu setzen 
(obwohl nix zu stehen scheint, weder bei Perl noch in man). Da wären 
wir wieder bei meiner Frage, denn symlink setzt $! auf (sowas 
wie) "File existiert", wenn da schon ein Symlink ist. Also hat es 
vorher $! gesetzt auf "Ungültiger Dateideskriptor" 

Calli


More information about the Vienna-pm mailing list