9

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

当设备挂载到受监控的目录时如何通知我?

4

5 回答 5

9

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

  1. 通过Netlink套接字从内核读取uevents并过滤掉那些不是的。"ACTION""mount"
  2. "/proc/mounts"当您收到带有操作的事件时读取并解析"mount"
  3. 使用刚刚挂载的设备查找挂载点的记录,如果它不是您正在观看的目录,则将其过滤掉。
于 2009-07-11T09:57:28.520 回答
4

编辑:更新不到 5 年过时

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

如果您使用这十年的某些东西,udisks也会为您完成所有这些工作。您需要查看/org/freedesktop/UDisks2上的org.Freedesktop.DBus.ObjectManager界面以查看新文件系统何时出现。

于 2009-07-16T06:27:28.277 回答
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)手册说你真的不需要为这个文件使用 inotify,它是可轮询的:

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

想知道为什么 inotify 不能在 /etc/mtab 上工作并找到这个手册页。

于 2014-07-10T07:55:31.803 回答
2

inotify 只告诉您有关卸载的信息,而 uevents 不再告诉您有关安装/卸载的信息。

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

#include <fcntl.h>
#include <errno.h>
#include <poll.h>
#include <unistd.h>
#include <stdio.h>

int main()
{
    int fd;
    struct pollfd ev;
    int ret;
    ssize_t bytesread;
    char buf[8192];

    fd = open("/proc/mounts", O_RDONLY);
    printf("########################################\n");
    while ((bytesread = read(fd, buf, sizeof(buf))) > 0)
        write(1, buf, bytesread);

    do {

        ev.events = POLLERR | POLLPRI;
        ev.fd = fd;
        ev.revents = 0;
        ret = poll(&ev, 1, -1);
        lseek(fd, 0, SEEK_SET);
        if (ev.revents & POLLERR) {
            printf("########################################\n");
            while ((bytesread = read(fd, buf, sizeof(buf))) > 0)
                write(1, buf, bytesread);
        }
    } while (ret >= 0);
    close(fd);

    return 0;
}

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

请注意,所有这些技术在过去的 Linux 版本中都不稳定和/或损坏。在 Linux 2.6.35 结束时(或者更早一点),这一切都变得稳定了。

于 2016-10-17T20:19:32.197 回答
1

如果您不介意大量误报,则可以close_nowrite/etc/fstab. . 看/etc/mtab,/proc/mounts等对我不起作用。

于 2012-09-03T12:42:52.623 回答