open(my $fh, '>', $path) || die $!;
my_sub($fh);
my_sub()는 $ fh에서 $ path를 어떻게 든 추정 할 수 있습니까?Perl의 파일 핸들러에서 파일 이름을 찾을 수 있습니까?
open(my $fh, '>', $path) || die $!;
my_sub($fh);
my_sub()는 $ fh에서 $ path를 어떻게 든 추정 할 수 있습니까?Perl의 파일 핸들러에서 파일 이름을 찾을 수 있습니까?
파일 핸들은 파일에 연결되지 않고 네트워크 소켓이나 자식 프로세스의 표준 출력에 연결되는 파이프에 연결될 수도 있습니다.
코드가 열리는 경로와 핸들을 연결하려면 해시와 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};
}
당신은 핸들에 stat
또는 IO::Handle::stat
를 호출 할 수 있습니다 - 당신이 열려있는 파일의 장치와 아이 노드를 줄 것이다. 그것과 작은 운영 체제 마법사를 사용하면 파일 이름을 찾을 수 있습니다. OK, 어쩌면 많은 운영 체제 마법이 가능합니다.
find
명령은 지정된 inode 번호를 가진 파일을 찾을 수있는 -inum
옵션이 있습니다. 이것은 gbacon이 권장하는 것처럼 파일을 열 때 경로 캐싱만큼 효율적이지 않을 수 있습니다.
또한 유효한 해결 방법이지만 속도는 느립니다 (언급 한대로). –
:
내가 가능한 경우, 찾기 -inum를 사용하는 것을 선호합니다. 또는 다음과 같은 방법을 사용하는 것이 좋습니다. 유닉스/리눅스 호환을 제외한 모든 단점!
my $filename='/tmp/tmp.txt';
open my $fh, '>', $filename;
my $fd = fileno $fh;
print readlink("/proc/$$/fd/$fd");
파일 핸들을 사용하지 않는 경우 (예 :'<>'사용)'fileeno $ {^ LAST_FH}'를 사용할 수도 있습니다. –
이것은 일반적으로 Unix와 호환되지 않는 Linux 호환 가능합니다. – tripleee
감사합니다. 내가 듣기를 원하는 것이 아니라보다 효과적인 해결 방법입니다. –
@ sh-beta 여러분을 환영합니다! 나는 그것이 도움이되기를 바랍니다. –