Wie kann ich erkennen, wenn ein Verzeichnis mit inotify angebracht ist?
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?
Lösung
Ich glaube nicht, dass Sie es mit inotify
tun können. Hier ist die Methode aber:
- Lesen Sie uevents von Kernel über einen Netlink Buchse und auszufiltern solche, bei denen
"ACTION"
nicht"mount"
. - Lese und
"/proc/mounts"
analysieren, wenn Sie ein Ereignis mit einer"mount"
Aktion. - 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).