web-dev-qa-db-ja.com

ファイルが開かれた回数を調べますか?

わかりました。これが頭脳のパズルです。Linuxマシンで現在実行されているすべてのプロセスによって特定のファイルが(任意のモードで)開かれた回数を確認するにはどうすればよいですか?つまり特定のファイル/ iノードを参照するために、グローバルに(または名前空間/コンテナ内で)使用されているファイル記述子はいくつありますか?

これを見つける1つの方法は、おそらくlsofを使用して、問題のファイル名がその出力に何回現れるかを数えることでしょう。しかし、それはエレガントではないように思われます。いずれにせよ、Cでプログラム的にこのようなものが必要になります。

編集:または同様の質問ですが、これも役立ちます:特定のファイル(ファイルシステム上のランダムなファイルであるため、ハンドラーをアタッチせず、何かが発生するのを待つ必要はありません)はまったく開かれていません、任意のプロセス(おそらくこれを除く)によって?

5
Ivan Voras

ファイルシステムのイベントハンドラーをファイルにアタッチする必要があると思います。inotifyを使用する方法です。コマンドラインツールとC APIがあります。私はそれを使用する専門家ではありません、私はコマンドラインツールを数分間いじっただけなので、コード例を提供しようとはしませんが、グーグル検索でたくさんの情報を見つけることができます。

https://www.ibm.com/developerworks/library/l-inotify/

https://linux.die.net/man/7/inotify

(上記のmanページから)次の通知を提供します。

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 (*).
2
David Parks