【问题标题】:Using inotify to track in_open & in_close events for a specific PID使用 inotify 跟踪特定 PID 的 in_open 和 in_close 事件
【发布时间】: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% 的准确性可能不是强制性要求。

标签: c inotify


【解决方案1】:

如果您需要特定于 Linux 的解决方案,您可以使用 fanotify。例如在这里查看 - http://git.infradead.org/users/eparis/fanotify-example.git。您可以订阅全局通知,然后只过滤那些您感兴趣的 pid 的通知。

【讨论】:

  • 感谢您的回答,这可能是一个解决方案。但由于这是一门大学c编程课程任务,恐怕它应该在这个任务中使用/PROC/PID/FD或FDINFO。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-17
  • 2015-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多