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

当设备安装在受监控的目录上时,如何通知我?

有帮助吗?

解决方案

我认为你不能这样做 inotify. 。不过方法如下:

  1. 来自内核的 uevent 通过一个 网联 套接字并过滤掉那些 "ACTION" 不是 "mount".
  2. 读取并解析 "/proc/mounts" 当您收到一个事件时 "mount" 行动。
  3. 查找刚刚安装的设备的安装点记录,如果不是您正在观看的目录,则将其过滤掉。

其他提示

修改更新为少于5年过时

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

如果你从这个十年的东西, udisks 会做这一切也适用于你。你需要看 org.Freedesktop.DBus.ObjectManager在 /组织/ freedesktop的接口/ UDisks2 以看到,当新的文件系统转起来。

在现代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中的作品上,并发现了这个手册页。

误报警

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

的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年底稳定(或者更早一点)。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top