2010-05-11 4 views

답변

16

파일 핸들은 파일에 연결되지 않고 네트워크 소켓이나 자식 프로세스의 표준 출력에 연결되는 파이프에 연결될 수도 있습니다.

코드가 열리는 경로와 핸들을 연결하려면 해시와 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}; 
} 
+0

감사합니다. 내가 듣기를 원하는 것이 아니라보다 효과적인 해결 방법입니다. –

+0

@ sh-beta 여러분을 환영합니다! 나는 그것이 도움이되기를 바랍니다. –

5

당신은 핸들에 stat 또는 IO::Handle::stat를 호출 할 수 있습니다 - 당신이 열려있는 파일의 장치와 아이 노드를 줄 것이다. 그것과 작은 운영 체제 마법사를 사용하면 파일 이름을 찾을 수 있습니다. OK, 어쩌면 많은 운영 체제 마법이 가능합니다.


find 명령은 지정된 inode 번호를 가진 파일을 찾을 수있는 -inum 옵션이 있습니다. 이것은 gbacon이 권장하는 것처럼 파일을 열 때 경로 캐싱만큼 효율적이지 않을 수 있습니다.

핸들 또는 파일 기술자에서 파일 이름을 찾을 수있는 더 나은 방법을 찾고 있습니다 누구든지
+0

또한 유효한 해결 방법이지만 속도는 느립니다 (언급 한대로). –

6

:

내가 가능한 경우, 찾기 -inum를 사용하는 것을 선호합니다. 또는 다음과 같은 방법을 사용하는 것이 좋습니다. 유닉스/리눅스 호환을 제외한 모든 단점!

my $filename='/tmp/tmp.txt'; 
open my $fh, '>', $filename; 
my $fd = fileno $fh; 
print readlink("/proc/$$/fd/$fd"); 
+0

파일 핸들을 사용하지 않는 경우 (예 :'<>'사용)'fileeno $ {^ LAST_FH}'를 사용할 수도 있습니다. –

+0

이것은 일반적으로 Unix와 호환되지 않는 Linux 호환 가능합니다. – tripleee