ファイルが何回開かれたかを確認しますか?

ファイルが何回開かれたかを確認しますか?

さて、ここで頭の痛い問題です。Linux マシンで現在実行中のプロセスのいずれかまたはすべてによって、特定のファイルが (任意のモードで) 何回開かれたかを調べるにはどうすればよいのでしょうか。つまり、特定のファイルまたは inode を参照するために、グローバルに (または名前空間またはコンテナー内で、どちらでもかまいません) ファイル記述子がいくつ使用されているかということです。

これを調べる 1 つの方法は、おそらく lsof を使用して、問題のファイル名がその出力に何回出現するかを数えることです。しかし、これはあまり洗練されていないようですし、いずれにしても、C でプログラム的にこのようなものが必要になります。

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

答え1

stat()現在開いているファイルについては、Linux の場合は、すべての/proc/*/fd/*ファイルを調べて inode 番号を比較し、すべてを読み取り/proc/*/maps(inode 番号も比較)る必要があります。

のフラグを確認し/proc/*/fdinfo/*(比較的新しいバージョンの Linux が必要)、/proc/*/mapsファイルが読み取りモードまたは書き込みモード (またはその両方、または追加モード) で開かれているかどうかを確認するには、 の 2 番目の列を確認します。

答え2

ファイルにファイルシステム イベント ハンドラーを添付するのが良いinotify方法だと思います。コマンド ライン ツールと C API があります。私はその使い方の専門家ではなく、コマンド ライン ツールを数分間試しただけなので、コード例は提供しませんが、Google 検索で多くの情報を見つけることができます。

https://www.ibm.com/developerworks/library/l-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 (*).

関連情報