Pregunta

Estoy usando Linux Inotify para detectar FS eventos en mi programa.

¿Cómo podría yo ser notificado cuando un dispositivo está montado en un directorio objeto de seguimiento?

¿Fue útil?

Solución

No creo que pueda hacerlo con inotify. Aquí está el método sin embargo:

  1. uevents del kernel a través de un conector de red y filtrar aquellos en los que no se "ACTION" "mount".
  2. leer y analizar "/proc/mounts" cuando recibe un evento con una acción "mount".
  3. Encontrar un récord para un punto de montaje con el dispositivo que se acaba de montar y filtrar hacia fuera si no es el directorio que está viendo.

Otros consejos

EDITAR: Actualización de menos de 5 años obsoleta

Si estás en nada, pero el más antiguo de los sistemas, libudev es lo que quiere para el primer paso.

Si tienes algo de esta década, udisks va a hacer todo esto para usted, también.Tendría que ver el org.Freedesktop.DBus.ObjectManager interfaz /org/freedesktop/UDisks2 a ver cuando los sistemas de ficheros vuelta para arriba.

En los sistemas modernos de Linux / etc / mtab menudo apunta a / proc / self / montajes:

$ 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) página de manual dice que usted don' t realmente necesitan utilizar inotify para este archivo, es pollable:

  

Desde la versión 2.6.15 del kernel, este                 pollable archivo es: después de abrir el archivo para lectura, un cambio                 en este archivo (es decir, un montaje de sistema de archivos o desmonte) causas                 seleccionar (2) para marcar el descriptor de archivo tan legible, y poll (2)                 y epoll_wait (2) marcar el archivo como teniendo una condición de error.

Se ha preguntado por qué inotify no funciona en / etc / mtab y encontramos este página de manual.

Si no te importa lotes de las falsas alarmas, es posible que pueda mirar para close_nowrite en /etc/fstab. . Viendo /etc/mtab, /proc/mounts, etc. no funciona para mí.

inotify sólo se le informa sobre desmonta y uevents ya no le dice acerca de montaje / desmontaje.

La forma de hacerlo es a sondear en / proc / mounts, leídas en el contenido, y realizar un seguimiento de los montajes que he visto, y luego reanálisis cuando la encuesta se despierta. La encuesta se despertará en ERR / PRI cuando cualquier sistema de archivos está montado o desmontado.

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

El código anterior se limita a imprimir los puntos de montaje en el arranque, y luego en cualquier montaje / desmontaje. Es hasta usted para "diff" que se enteren lo consiguió añadido / borrado.

Tenga en cuenta, todas estas técnicas ha sido a la vez inestable y / o roto en las versiones anteriores de Linux. Todo se puso estable alrededor de finales de Linux 2.6.35 (o tal vez un poco antes).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top