좋아, 여기에 두뇌 퍼즐이 있습니다. 현재 Linux 시스템에서 실행 중인 모든/모든 프로세스에서 특정 파일이 (모든 모드에서) 몇 번이나 열렸는지 어떻게 알 수 있습니까? 즉, 특정 파일/inode를 참조하는 전역적으로(또는 네임스페이스/컨테이너 내에서는 중요하지 않음) 얼마나 많은 파일 설명자가 사용됩니까?
이를 알아내는 한 가지 방법은 아마도 lsof를 사용하여 문제의 파일 이름이 출력에 나타나는 횟수를 계산하는 것입니다. 하지만 그것은 우아하지 않은 것 같고 어떤 경우에도 C에서 프로그래밍 방식으로 이와 같은 것이 필요합니다.
편집하다: 또는 비슷하지만 다른 질문도 도움이 될 수 있습니다. 특정 파일(파일 시스템의 임의 파일이므로 첨부 핸들러가 없고 어떤 일이 일어나기를 기다리지 않음)이 모든 프로세스에 의해 전혀 열립니다(아마도 이것을 제외함). 하나)?
답변1
stat()
현재 열려 있는 파일의 경우 Linux의 경우 모든 파일을 확인 /proc/*/fd/*
하고 inode 번호를 비교해야 합니다. 모든 내용을 읽고 /proc/*/maps
inode 번호도 비교합니다.
플래그를 확인하고 /proc/*/fdinfo/*
(비교적 최신 버전의 Linux 필요) /proc/*/maps
파일이 읽기 또는 쓰기 모드(또는 둘 다 또는 추가 모드로...)로 열려 있는지 여부를 확인하는 두 번째 열을 확인하세요.
답변2
내 생각에는 파일 시스템 이벤트 핸들러를 파일에 첨부하려는 것이 inotify
좋습니다. C API뿐만 아니라 명령줄 도구도 있습니다. 나는 그것을 사용하는 전문가가 아니며 몇 분 동안 명령줄 도구를 사용했을 뿐이므로 코드 예제를 제공하지는 않지만 Google 검색에서 많은 정보를 찾을 수 있습니다.
https://www.ibm.com/developerworks/library/l-inotify/
https://linux.die.net/man/7/inotify
위의 매뉴얼 페이지에서 다음에 대한 알림을 제공합니다.
IN_ACCESS
File was accessed (read) (*).
IN_ATTRIB
Metadata changed, e.g., permissions, timestamps, extended attributes, link count (since Linux 2.6.25), UID, GID, etc. (*).
IN_CLOSE_WRITE
File opened for writing was closed (*).
IN_CLOSE_NOWRITE
File not opened for writing was closed (*).
IN_CREATE
File/directory created in watched directory (*).
IN_DELETE
File/directory deleted from watched directory (*).
IN_DELETE_SELF
Watched file/directory was itself deleted.
IN_MODIFY
File was modified (*).
IN_MOVE_SELF
Watched file/directory was itself moved.
IN_MOVED_FROM
File moved out of watched directory (*).
IN_MOVED_TO
File moved into watched directory (*).
IN_OPEN
File was opened (*).