파일이 열려 있는지 어떻게 알 수 있나요?

파일이 열려 있는지 어떻게 알 수 있나요?

내 코드는 디렉터리의 파일을 반복하여 시스템의 다른 프로세스에서 현재 열려 있는(쓰기용) 파일만 선택해야 합니다.

이상적인 솔루션은 모든 Unix에서 작동하지만 저는 Linux용으로만 선택하겠습니다.

프로그램은 Python으로 작성되었지만 필요한 경우 사용자 정의 C 함수를 추가할 수 있습니다. 여기에 사용할 수 있는 API가 무엇인지 알아야 합니다...

내가 찾은 한 가지 제안은 Linux에서 모든 파일 설명자를 반복 /proc하고 해당 링크를 구문 분석하여 관심 있는 파일을 가리키는지 확인하는 것입니다. 그런데 더 무거워진 것 같은데...

예를 들어, 파일을 열면 참조 카운트가 증가한다는 것을 알고 있습니다. 파일 시스템은 열린 파일의 블록을 해제하지 않습니다.삭제되더라도- 종료될 때까지 - 기능에 따라 다릅니다 tmpfile(3).

아마도 사용자 프로세스가 커널의 이러한 레코드에 액세스할 수 있을까요?

답변1

Linux 에서는 /proc/<pid>/fd/. <pid>이는 열린 파일 목록을 빠르고 쉽게 작성할 수 있음을 의미합니다.지금이 순간어떤 콘텐츠에 연결되어 있는지 확인합니다.

생각보다 "무거운" 것은 아닙니다. 예를 들어, 내 오래된 AMD Phenom-II 1090T(현재 약 1000개의 프로세스를 실행 중)에서는 아래의 bash while/read 루프를 실행하는 데에도 약 1.5초밖에 걸리지 않습니다.

Bash에서는 다음을 사용하여 연관 배열을 만들 수 있습니다.

declare -A openfiles

while IFS=$'\n' read l; do
  openfiles[$l]=1
done < <(find /proc/*/fd/ -type l -printf '%l\0' |
           grep -zvE '^(socket|pipe|anon_inode):' | sort -zu)

(단순한 예일 뿐 전혀 최적화되지 않았습니다. 최적화하는 것은 전혀 어렵지 않습니다)

그런 다음 파일이 열려 있는지 확인하십시오.

if [ "${openfiles[full-path-to-file]}" == 1 ] ; then .... ; fi

Python에서는 사전을 사용 os.walk()하고 작성할 수 있습니다. os.readlink()또는 사용프로세스,프로세스 파일 시스템또는프수틸기준 치수.

psutil크로스 플랫폼이며 open_files()여기에 유용한 방법이 있습니다.

참고: 를 사용하여 이 작업을 수행할 수 있지만 lsof속도 lsof가 매우 느립니다. 이는 업무에 필요한 것보다 훨씬 더 많은 일을 합니다.

답변2

fnctl당신이 찾고있는 것. 해당 man페이지는 매우 상세합니다. 열린 파일이 읽기 전용인지 쓰기 가능한지 알려주고 닫힌 파일에 대해 -1을 반환합니다. 이는 강력하며 (버기) 잠금 메커니즘과 같은 추가 세부정보를 제공할 수 있습니다.

#include <fcntl.h>

int
fcntl(int fd, int cmd, ...);

귀하의 목적에 따라 F_GETFL아래와 같이 플래그를 사용하십시오

int r, fd;
r = fcntl ( fd, F_GETFL );

if (r==-1)
printf("File %d is closed.\n", fd);
if (r>0)
printf("File %d is open.\n", fd);

반환 값이 -1이면 파일이 열려 있지 않은 것입니다(또는 fd유효한 파일 설명자가 아닙니다). 반환 값이 양수이면 fd열린 파일이 설명됩니다.

관련 정보