さて、ここで頭の痛い問題です。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 (*).