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

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

Может my_sub () так или иначе экстраполируют $path от $fh?

20
задан sh-beta 11 May 2010 в 17:48
поделиться

2 ответа

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

Если вы хотите связать дескрипторы с путями, открываемыми вашим кодом, используйте хэш и оператор 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};
}
16
ответ дан 30 November 2019 в 00:39
поделиться

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


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

6
ответ дан 30 November 2019 в 00:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: