[Vienna-pm] symlink: Ungültiger Dateidescriptor

Peter J. Holzer hjp-vienna-pm-list at hjp.at
Sat Jun 14 15:05:52 PDT 2008


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
    }

> > > ); 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.


> 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.

	hp

-- 
   _  | Peter J. Holzer    | It took a genius to create [TeX],
|_|_) | Sysadmin WSR       | and it takes a genius to maintain it.
| |   | hjp at hjp.at         | That's not engineering, that's art.
__/   | http://www.hjp.at/ |	-- David Kastrup in comp.text.tex
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 189 bytes
Desc: Digital signature
Url : http://mail.pm.org/pipermail/vienna-pm/attachments/20080615/f267a06b/attachment.bin 


More information about the Vienna-pm mailing list