【发布时间】:2012-04-21 22:28:32
【问题描述】:
我正在用 ANSI C 编写一个程序,它将 PID 作为参数,并且每次在给定的 PID 打开或关闭任何文件时,都需要在标准输出上打印有关文件名的信息。
基本上我们知道,/proc/PID/fd 目录包含指向文件的符号链接,由 PID 使用。
通过在 while 循环中对该目录进行 readdir()'ing 并 readlink()'ing 每个元素 - 我可以获得当前由 PID 打开的所有文件的文件名并将它们打印到 stdout。 但这并不能完全解决我最初的任务——我只需要将打开的文件描述符表中 PID 的更改事件打印到 STDOUT。此外,我不仅需要捕捉新文件何时打开,还需要捕捉它的 FD 何时关闭。
所以,我需要一些机制来捕获用户空间中给定 PID 的文件访问事件。
我还尝试使用 inotify() 机制来捕获 IN_OPEN / IN_CLOSE,但这仅适用于常规目录,不适用于 /proc (procfs)!当我为 /proc/PID/fd 目录添加 inotify_watch 时 - 它根本不会捕获任何事件(很可能是由于 PROCFS 的性质)
您能否建议解决我的任务的机制? 附言对不起,我的英语不好。
【问题讨论】:
-
有问题的 PID 是否将由与观察程序相同的用户运行?您是否需要 100% 的准确率,或者一些“错过”的事件可以吗?
-
我们假设 watcher 程序以 root 用户权限运行。关于错过事件的问题 - 这取决于错过事件的数量。事实上,这是大学的编程任务,所以我真的不认为它需要深入的内核级编程,或者编写一些守护进程级的程序,捕获内核 FS 事件。它应该是一个基本的用户空间实用程序,所以 100% 的准确性可能不是强制性要求。