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

Iva*_*ras 6 filesystems c system-calls lsof

好的,这是一个脑力难题:如何找出当前在 Linux 机器上运行的任何/所有进程(以任何模式)打开特定文件的次数?即有多少文件描述符,全局(或在命名空间/容器内,无关紧要)正在使用引用特定文件/inode?

找出这一点的一种方法可能是使用 lsof 并计算有问题的文件名在其输出中出现的次数。但这似乎不雅,无论如何,我需要在 C 中以编程方式进行类似的操作。

编辑:或者可能是一个类似但不同的问题,这也有帮助:任何进程(可能不包括这个)?

Dav*_*rks 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 (*).
Run Code Online (Sandbox Code Playgroud)