파일이 몇 번이나 열렸는지 알아보세요.

파일이 몇 번이나 열렸는지 알아보세요.

좋아, 여기에 두뇌 퍼즐이 있습니다. 현재 Linux 시스템에서 실행 중인 모든/모든 프로세스에서 특정 파일이 (모든 모드에서) 몇 번이나 열렸는지 어떻게 알 수 있습니까? 즉, 특정 파일/inode를 참조하는 전역적으로(또는 네임스페이스/컨테이너 내에서는 중요하지 않음) 얼마나 많은 파일 설명자가 사용됩니까?

이를 알아내는 한 가지 방법은 아마도 lsof를 사용하여 문제의 파일 이름이 출력에 나타나는 횟수를 계산하는 것입니다. 하지만 그것은 우아하지 않은 것 같고 어떤 경우에도 C에서 프로그래밍 방식으로 이와 같은 것이 필요합니다.

편집하다: 또는 비슷하지만 다른 질문도 도움이 될 수 있습니다. 특정 파일(파일 시스템의 임의 파일이므로 첨부 핸들러가 없고 어떤 일이 일어나기를 기다리지 않음)이 모든 프로세스에 의해 전혀 열립니다(아마도 이것을 제외함). 하나)?

답변1

stat()현재 열려 있는 파일의 경우 Linux의 경우 모든 파일을 확인 /proc/*/fd/*하고 inode 번호를 비교해야 합니다. 모든 내용을 읽고 /proc/*/mapsinode 번호도 비교합니다.

플래그를 확인하고 /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 (*).

관련 정보