Могу ли я найти имя файла из дескриптора файла в Perl? - PullRequest
20 голосов
/ 11 мая 2010
open(my $fh, '>', $path) || die $!;
my_sub($fh);

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

Ответы [ 3 ]

16 голосов
/ 11 мая 2010

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

Если вы хотите связать дескрипторы с путями, которые открывает ваш код, используйте хеш и оператор 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};
}
7 голосов
/ 26 июня 2012

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

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

my $filename='/tmp/tmp.txt';
open my $fh, '>', $filename;
my $fd = fileno $fh;
print readlink("/proc/$$/fd/$fd");
6 голосов
/ 11 мая 2010

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


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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...