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

statまたはファイルハンドルを呼び出すことができますIO::Handle::stat。これにより、開いたファイルのデバイスとiノードが提供されます。それと少しのオペレーティングシステムのウィザードで、ファイル名を見つけることができます。OK、多分多くのオペレーティングシステムの魔法。


このfindコマンドには-inum、指定されたiノード番号を持つファイルを検索するオプションがあります。これは、gbaconが推奨するように、ファイルを開いたときにパスをキャッシュするほど効率的ではない可能性があります。

于 2010-05-11T18:37:53.773 に答える