如何检测使用inotify挂载目录的时间?

时间:2009-07-11 07:39:47

标签: c linux kernel inotify

我正在使用Linux Inotify来检测程序中的FS事件。

如果设备挂载在受监控目录上,我如何得到通知?

5 个答案:

答案 0 :(得分:9)

我认为你不能用inotify做到这一点。这是方法:

  1. 通过uevents from kernel套接字阅读Netlink并过滤掉"ACTION"不是"mount"的内容。
  2. 当你收到"mount"行动的事件时
  3. Read and parse "/proc/mounts"
  4. 使用刚装入的设备查找装入点的记录,如果它不是您正在观看的目录,请将其过滤掉。

答案 1 :(得分:4)

编辑:更新已过时不到5年

如果您使用的是最古老的系统,libudev就是您想要的第一步。

如果您正处于这十年的某些事情,udisks也将为您完成所有这些工作。您需要查看org.Freedesktop.DBus.ObjectManager上的/org/freedesktop/UDisks2界面,了解新filesystems何时开启。

答案 2 :(得分:2)

在现代Linux系统上/ etc / mtab经常指向/ proc / self / mounts:

$ ls -l /etc/mtab lrwxrwxrwx 1 root root 12 Sep 5 2013 /etc/mtab -> /proc/mounts $ ls -l /proc/mounts lrwxrwxrwx 1 root root 11 Jul 10 14:56 /proc/mounts -> self/mounts

proc(5)manpage说你真的不需要为这个文件使用inotify,它是可轮询的:

  

从内核版本2.6.15开始,这个                 文件是可轮询的:打开文件进行读取后,进行更改                 在此文件中(即文件系统挂载或卸载)导致                 select(2)将文件描述符标记为可读,并轮询(2)                 和epoll_wait(2)将文件标记为有错误条件。

想知道为什么inotify不能在/ etc / mtab上运行并找到这个联机帮助页。

答案 3 :(得分:1)

如果您不介意批次错误警报,您可以在close_nowrite上关注/etc/fstab。 。观看/etc/mtab/proc/mounts等不适合我。

答案 4 :(得分:1)

inotify只会告诉你有关卸载的信息,并且uevents不再告诉你有关mount / unmount的信息。

要做的是在/ proc / mounts上进行轮询,读入内容,并跟踪您看到的坐载,然后在轮询唤醒时重新解析。当挂载或卸载任何文件系统时,轮询将在ERR / PRI上唤醒。

(DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))(CONNECT_DATA = (SERVER = DEDICATED)(SERVICE_NAME = pdborcl))
  )

上面的代码只是在启动时打印出挂载点,然后在任何挂载/卸载时打印出来。由你来“区分”它们以找出添加/删除的内容。

请注意,在过去的Linux版本中,所有这些技术都不稳定和/或破坏。它在Linux 2.6.35的末尾(或者可能更早一点)得到了稳定。