Domanda

sto usando Linux Inotify per rilevare eventi FS sul mio programma.

Come potrei essere avvisato quando un dispositivo è montato su una directory monitorata?

È stato utile?

Soluzione

Non credo che si può fare con inotify. Ecco il metodo però:

  1. uevent dal kernel tramite un il socket netlink e filtrare quelli in cui non è "ACTION" "mount".
  2. Leggere e analizzare "/proc/mounts" quando si ottiene un evento con un'azione "mount".
  3. Trova un record per un punto di montaggio con il dispositivo che è stato appena montato e filtrare fuori se non è la directory che si sta guardando.

Altri suggerimenti

Modifica Aggiorna per essere inferiore a 5 anni obsoleto

Se siete su qualsiasi cosa, ma il più antico dei sistemi, libudev è ciò che si vuole per il primo passo.

Se siete su qualcosa da questo decennio, udisks farà tutto questo anche per te. Avresti bisogno di guardare il org.Freedesktop.DBus.ObjectManager interfaccia su / org / freedesktop / UDisks2 per vedere quando nuova filesystem alzare.

Nei moderni sistemi Linux / etc / mtab spesso punta a / 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 dice che don' t davvero bisogno di usare inotify per questo file, è pollable:

  

Dalla versione del kernel 2.6.15, questo                 file è pollable: dopo aver aperto il file per la lettura, un cambiamento                 in questo file (vale a dire, montare un file system o smontare) cause                 selezionare (2) per contrassegnare il descrittore di file come leggibili, e sondaggio (2)                 e epoll_wait (2) contrassegnare il file come avere una condizione di errore.

È stato chiesti perché inotify non funziona su / etc / mtab e abbiamo trovato questo manpage.

Se non ti dispiace un sacco di falsi allarmi, si potrebbe essere in grado di guardare per close_nowrite su /etc/fstab. . Guardando /etc/mtab, /proc/mounts, ecc non funziona per me.

inotify solo si racconta smonta, e uevent non si racconta montaggio / smontaggio.

Il modo per farlo è quello di sondaggio su / proc / mounts, leggere nei contenuti, e tenere traccia dei monti che hai visto, e poi rianalizzare quando il sondaggio si sveglia. Il sondaggio si risveglierà su ERR / PRI quando un qualsiasi file system è montato o smontato.

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

Il codice di cui sopra si limita a stampare i punti di montaggio all'avvio, e poi su qualsiasi montaggio / smontaggio. E 'a voi per "diff" loro di scoprire cosa ma ho aggiunto / rimosso.

Nota, tutte queste tecniche è stato sia instabile e / o rotti nelle versioni precedenti di Linux. Tutto ottenuto stabile intorno alla fine del Linux 2.6.35 (o forse un po 'prima).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top