Question

J'utilise Linux Inotify pour détecter des événements de FS sur mon programme.

Comment pourrais-je être prévenu lorsqu'un appareil est monté sur un répertoire contrôlé?

Était-ce utile?

La solution

Je ne pense pas que vous pouvez le faire avec inotify. Voici la méthode que:

  1. uevents de du noyau via un la prise de Netlink et filtrer ceux où "ACTION" ne "mount".
  2. Lire et analyser "/proc/mounts" lorsque vous obtenez un événement avec une action "mount".
  3. Trouver un record pour un point de montage avec le dispositif qui vient d'être monté et le filtrer si ce n'est pas le répertoire que vous regardez.

Autres conseils

EDIT: mise à jour à moins de 5 ans obsolète

Si vous êtes sur quoi que ce soit, mais le plus ancien des systèmes, libudev est ce que vous voulez pour la première étape.

Si vous êtes quelque chose de cette décennie, udisks fera tout cela pour toi aussi. Vous auriez besoin de regarder org.Freedesktop.DBus.ObjectManager interface sur / org / freedesktop / UDisks2 pour voir quand de nouveaux systèmes de fichiers se présenter.

Sur les systèmes Linux modernes / etc / mtab souvent des points à / proc / auto / 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 dit que vous n » t vraiment besoin d'utiliser inotify pour ce fichier, il est pollable:

  

Depuis la version 2.6.15 du noyau, ce                 fichier est pollable: après l'ouverture du fichier pour la lecture, un changement                 dans ce fichier (à savoir, un système de fichiers monter ou démonter) Causes                 select (2) pour marquer le descripteur de fichier comme lisible et poll (2)                 et epoll_wait (2) marquer le fichier comme étant une condition d'erreur.

était-demandé pourquoi inotify fonctionne pas / etc / mtab et trouvé cette page de manuel.

Si cela ne vous dérange pas beaucoup de fausses alarmes, vous pourriez être en mesure de surveiller close_nowrite sur /etc/fstab. . Regarder /etc/mtab, /proc/mounts, etc. ne fonctionne pas pour moi.

inotify ne vous parle de démontages et uevents ne vous parle de montage / démontage.

La façon de faire est de sondage sur / proc / mounts, lire dans le contenu, et de garder trace des supports que vous avez vu, et réanalyser puis quand le scrutin se réveille. Le sondage se réveillera sur ERR / PRI lorsqu'un système de fichiers est monté ou démonté.

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

Le code ci-dessus n'imprime les points de montage au démarrage, puis sur un montage / démontage. Il est à vous pour les « diff » pour savoir ce qui se est ajouté / enlevé.

Note, toutes ces techniques ont été à la fois dans les versions précédentes Linux instable et / ou cassé. Tout se stable autour de la fin de Linux 2.6.35 (ou peut-être un peu plus tôt).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top