好吧,這是一個大腦難題:我如何找出 Linux 機器上目前運行的任何/所有進程(以任何模式)開啟特定檔案的次數?即,全域(或在命名空間/容器內,無關緊要)有多少檔案描述符正在引用特定檔案/索引節點?
找出這個問題的一種方法可能是使用 lsof 併計算有問題的檔案名稱在其輸出中出現的次數。但這似乎不太優雅,無論如何,我需要在 C 中以程式方式實現這樣的東西。
編輯:或者可能是一個類似但不同的問題,這也會有所幫助:是由任何進程(可能不包括這個)打開的特定文件(文件系統上的隨機文件,因此沒有附加處理程序並等待發生某些事情)一)?
答案1
對於目前開啟的文件,如果在Linux上,則必須比較stat()
所有/proc/*/fd/*
文件並比較inode編號;並讀取所有/proc/*/maps
(並比較 inode 編號)。
檢查(需要相對較新版本的 Linux)中的標誌/proc/*/fdinfo/*
和第二列中的/proc/*/maps
檔案是否以讀取或寫入模式(或兩者,或附加...)開啟。
答案2
我認為您想將文件系統事件處理程序附加到文件,inotify
這是正確的方法。有一個命令列工具和一個 C API。我不是使用它的專家,我只用了幾分鐘的命令列工具,所以我不會嘗試提供任何程式碼範例,但你可以在谷歌搜尋上找到很多資訊。
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 (*).