找出文件被打開了幾次?

找出文件被打開了幾次?

好吧,這是一個大腦難題:我如何找出 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 (*).

相關內容