Frage

Ich verwende Linux Inotify FS Ereignisse auf meinem Programm zu erkennen.

Wie kann ich benachrichtigt, wenn ein Gerät auf einem überwachten Verzeichnis gemountet ist?

War es hilfreich?

Lösung

Ich glaube nicht, dass Sie es mit inotify tun können. Hier ist die Methode aber:

  1. Lesen Sie uevents von Kernel über einen Netlink Buchse und auszufiltern solche, bei denen "ACTION" nicht "mount".
  2. Lese und "/proc/mounts" analysieren, wenn Sie ein Ereignis mit einer "mount" Aktion.
  3. Finden Sie eine Aufzeichnung für einen Mount-Punkt mit Gerät, das gerade montiert wurde und es herauszufiltern, wenn es nicht das Verzeichnis ist Sie beobachten.

Andere Tipps

EDIT: Update auf weniger als 5 Jahren veraltet

Wenn Sie auf etwas anderes als die ältesten Systeme, libudev ist, was Sie für den ersten Schritt wollen.

Wenn Sie auf etwas aus diesem Jahrzehnt, udisks wird all dies tun für dich auch. Sie müssten die org.Freedesktop.DBus.ObjectManager sehen Schnittstelle auf / org / Freedesktop / UDisks2 wenn neue Dateisysteme sehen aufdrehen.

Auf modernen Linux-Systemen / etc / mtab oft auf / 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 sagt, dass Sie don‘ t verwenden müssen inotify für diese Datei wirklich, es ist abfragbaren:

  

Da der Kernel-Version 2.6.15, diese                 Datei ist abfragbaren: Nachdem die Datei zum Lesen öffnen, eine Änderung                 in dieser Datei (das heißt, ein Dateisystem oder Deaktivieren) Ursachen                 auswählen (2) den Dateideskriptor markieren als lesbar und poll (2)                 und epoll_wait (2) markieren Sie die Datei als mit einer Fehlerbedingung.

gewundert wurde, warum inotify funktioniert nicht auf / etc / mtab und fand diese Manpage.

Wenn Sie nichts dagegen nicht viel von Fehlalarmen, können Sie möglicherweise für close_nowrite auf /etc/fstab beobachten. . Beobachten /etc/mtab, /proc/mounts usw. ist für mich nicht.

inotify sagt Ihnen, nur über Aushänge und uevents nicht mehr informiert Sie über mount / unmount.

Die Art und Weise zu tun ist, abzufragen auf / proc / mounts, in den Inhalt zu lesen, und halten Sie den Überblick über die Halterungen Sie gesehen haben, und dann, wenn die Analysepunkte Umfrage aufwacht. Die Umfrage wird bis auf ERR / PRI aufwecken, wenn ein Dateisystem gemountet ist oder ausgehängt.

#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;
}

Der obige Code druckt gerade aus den Mount-Punkten beim Start, und dann auf jedem mount / unmount. Es liegt an Ihnen, „diff“, um sie herauszufinden, was wurde hinzugefügt / entfernt.

Beachten Sie, all diese Techniken wurden in den vergangenen Linux-Versionen sowohl instabil und / oder gebrochen hat. Das alles bekam stabil um das Ende von Linux 2.6.35 (oder vielleicht auch etwas früher).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top