Подтвердить что ты не робот

Могу ли я найти имя файла из дескриптора файла в Perl?

open(my $fh, '>', $path) || die $!;
my_sub($fh);

Может ли my_sub() каким-то образом экстраполировать $path из $fh?

4b9b3361

Ответ 1

Файл-дескриптор может быть даже не подключен к файлу, а вместо этого в сетевой сокет или канал, подключенный к стандартным выводам дочернего процесса.

Если вы хотите связать дескрипторы с путями, которые открывает ваш код, используйте хеш и fileno, например,

my %fileno2path;

sub myopen {
  my($path) = @_;

  open my $fh, "<", $path or die "$0: open: $!";

  $fileno2path{fileno $fh} = $path;
  $fh;
}

sub myclose {
  my($fh) = @_;
  delete $fileno2path{fileno $fh};
  close $fh or warn "$0: close: $!";
}

sub path {
  my($fh) = @_;
  $fileno2path{fileno $fh};
}

Ответ 2

Кто бы мог найти лучший способ найти имя файла из дескриптора файла или файлового дескриптора:

Я бы предпочел использовать find -inum, если он доступен. Или, как насчет того, чтобы использовать следующий путь, всегда - любые недостатки, кроме совместимых с unix/linux!

my $filename='/tmp/tmp.txt';
open my $fh, '>', $filename;
my $fd = fileno $fh;
print readlink("/proc/$$/fd/$fd");

Ответ 3

Вы можете вызвать stat или IO::Handle::stat на дескрипторе файла - это даст вам устройство и inode файла, который вы открыли. С этим и небольшим волшебством операционной системы вы можете найти имя файла. Хорошо, может быть, много волшебства операционной системы.


Команда find имеет параметр -inum, чтобы найти файл с указанным номером inode. Вероятно, это будет не так эффективно, как кеширование пути при открытии файла, как рекомендует gbacon.