내 코드는 디렉터리의 파일을 반복하여 시스템의 다른 프로세스에서 현재 열려 있는(쓰기용) 파일만 선택해야 합니다.
이상적인 솔루션은 모든 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
열린 파일이 설명됩니다.