ファイルが何回開かれたか調べてください。

ファイルが何回開かれたか調べてください。

まあ、ここに脳パズルがあります。現在、Linuxシステムで実行されているすべてのプロセス(すべてのモード)で特定のファイルを何回開いたかを確認するには?つまり、特定のファイル/inodeを参照するグローバルに(または名前空間/コンテナ内では重要ではありません)、どのくらいのファイル記述子がありますか?

これを見つける1つの方法は、lsofを使用して、問題のあるファイル名が出力に表示される回数を数えることです。しかし、これは非常にエレガントに見えず、とにかくCでプログラム的にこのようなものを実装する必要があります。

編集する:または同様ですが、他の質問かもしれません。この質問も役に立ちます。すべてのプロセスで開かれる特定のファイル(ファイルシステム上の任意のファイル)なので(おそらくこのファイルは含まれていない)、ハンドラが接続されず、何かが発生するのを待っています。 )?

答え1

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

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

答え2

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

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

関連情報