[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