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

my_sub() 能以某种方式从 $fh 推断 $path 吗?

4

3 回答 3

17

文件句柄甚至可能不连接到文件,而是连接到网络套接字或连接到子进程标准输出的管道。

如果要将句柄与代码打开的路径相关联,请使用哈希和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};
}
于 2010-05-11T17:56:47.507 回答
8

谁可能正在寻找从文件句柄或文件描述符中查找文件名的更好方法:

如果可用,我更喜欢使用 find -inum 。或者,如何始终使用以下方式 - 除了 unix/linux 兼容之外的任何缺点!

my $filename='/tmp/tmp.txt';
open my $fh, '>', $filename;
my $fd = fileno $fh;
print readlink("/proc/$$/fd/$fd");
于 2012-06-25T21:18:10.770 回答
6

您可以调用statIO::Handle::stat在文件句柄上 - 这将为您提供已打开文件的设备和 inode。有了它和一点操作系统向导,您就可以找到文件名。好的,也许有很多操作系统魔法。


find命令具有-inum查找具有指定 inode 编号的文件的选项。正如 gbacon 建议的那样,这可能不会像打开文件时缓存路径那样有效。

于 2010-05-11T18:37:53.773 回答