[Vienna-pm] symlink: Ungültiger Dateidescriptor
Calli
gooly at gmx.at
Sat Jun 14 01:07:11 PDT 2008
Am Samstag, 14. Juni 2008 schrieb Lars Dɪᴇᴄᴋᴏᴡ 迪拉斯:
> Hallo Calli,
>
> du redest ganz schön wirr. Keine Angabe über Betriebssystem und
> Perlversion, kein Quellcode zum nachvollziehen.
Dachte nicht, dass das so eine große Rolle spielt bei einer
Perl-Standard-Funktion. SuSE 9.3, Kern 2.6.11.4-21.17-smp
Perl 5.8.6-5.3
> 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.
# hier nun, in etwa was schon geschreiben ..
if ( $! =~ /Ung.+?ateideskriptor/ ) {
my $nF = (( $oF =~ /.+\/(.+)/ ) ? "/tmp/$1" : "/tmp/$oF");
system('mv','-T', $oF, $nF );
system('mv','-T', $nF, $oF );
symlink($oF,$tstSL.(($oF =~ /.+\/(.+)/ ) ? "/$1" : "/$_[1]") );
next if ( $? || $! =~ /exist/ ); # File exists ist hier keinFehler
die "hmm: $oF =>$!\n";
}
}
>
> Ich habe soeben mit dem Programm unten erfolgreich knapp 70000
> Dateien einsortiert. Das ist mit Perl 5.10 auf Linux 2.6.
>
> 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 $!
>
> #!/usr/bin/env perl
> use utf8;
> use 5.010;
> use strict;
> use warnings FATAL => 'all';
> use File::HomeDir qw();
> use File::Next qw();
> use File::Path qw(mkpath);
> use IPC::System::Simple qw(capture);
> use Path::Class qw(dir file);
> use Readonly qw(Readonly);
>
> Readonly my $home => File::HomeDir->my_home;
> Readonly my $next => File::Next::files({follow_symlinks => 0},
> $home); my $counter = 0;
> while (defined (my $filename = $next->())) {
> next if -l $filename;
> next unless -f _ and -r _;
> chomp(my $type = capture(qw(file -b -i), $filename));
> $type =~ s{[;,] .* \z}{}msx;
> my $target_dir = dir($home, 'calli_test', split m|/|, $type);
> mkpath $target_dir, {verbose => 0} unless -e $target_dir;
> unless (symlink $filename, file($target_dir, $counter)) {
> say "$filename: $!";
> };
> $counter++;
> };
More information about the Vienna-pm
mailing list