找出文件被打开了多少次?

找出文件被打开了多少次?

好吧,这是一个大脑难题:如何找出当前在 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 (*).

相关内容