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