我怎么能检测何时目录安装有inotify的?(How could I detect when a d

2019-07-30 01:24发布

我使用Linux的inotify来检测我的程序FS事件。

怎么能当设备被安装在受监控的目录通知我?

Answer 1:

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

  1. 阅读从内核uevents通过网络链路插座和过滤掉那些"ACTION"是不是"mount"
  2. 阅读和分析"/proc/mounts"当你有一个事件"mount"行动。
  3. 查找一个挂载点与设备刚安装和过滤出来,如果它不是你正在看的目录记录。


Answer 2:

编辑:更新是少于5年淘汰

如果你对任何事情,但最古老的系统, libudev是你想要的第一步。

如果你对某事的这十年, udisks会做这一切为你。 你需要看org.Freedesktop.DBus.ObjectManager上的接口/组织/ freedesktop的/ UDisks2时看到新的文件系统转起来。



Answer 3:

在现代的Linux系统的/ etc / mtab中往往指向的/ proc /自/坐骑:

$ 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,该文件是可轮询:在此文件中打开文件进行读取,一个变化(即,文件系统装载或卸载)会导致选择(2)来标记文件描述符为可读,和轮询(2后)和epoll_wait(2)将文件标记为具有一个错误条件。

当时不知道为什么没有的inotify上工作的/ etc / mtab中,发现了这个手册页。



Answer 4:

如果你不介意大量的误报,你也许能够观看close_nowrite/etc/fstab 。 。 看着/etc/mtab/proc/mounts等,不适合我的工作。



Answer 5:

inotify的只是告诉你卸载和热插拔事件不再告诉你挂载/卸载。

做的方法是轮询的/ proc /坐骑,在内容阅读,并跟踪你已经看到了坐骑,而当调查醒来,然后重新分析。 当任何文件系统被装载或卸载的轮询将醒来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(或者更早一点)的时候买的稳定。



文章来源: How could I detect when a directory is mounted with inotify?