Estoy usando Linux Inotify para detectar eventos FS en mi programa.¿Cómo puedo detectar cuando un directorio está montado con inotify?
¿Cómo podría recibir una notificación cuando un dispositivo esté montado en un directorio supervisado?
Estoy usando Linux Inotify para detectar eventos FS en mi programa.¿Cómo puedo detectar cuando un directorio está montado con inotify?
¿Cómo podría recibir una notificación cuando un dispositivo esté montado en un directorio supervisado?
No creo que pueda hacerlo con inotify
. Aquí está el método sin embargo:
"ACTION"
"mount"
."/proc/mounts"
cuando obtiene un evento con una acción "mount"
.EDIT: actualización para que sea menos de 5 años obsoletos
Si se encuentra en otra cosa que el más antiguo de los sistemas, libudev es lo que desea para el primer paso.
Si tiene algo de esta década, udisks hará todo esto por usted también. Debería ver la interfaz org.Freedesktop.DBus.ObjectManager en /org/freedesktop/UDisks2 para ver cuándo aparece el nuevo filesystems.
Si no te importa un montón de falsas alarmas, es posible que pueda mirar para close_nowrite
en /etc/fstab
. . Ver /etc/mtab
, /proc/mounts
, etc. no funciona para mí.
En los sistemas Linux modernos/etc/mtab menudo apunta a montajes/proc/self /:
$ 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 que usted realmente no necesita utilizar inotify para este archivo , es pollable:
Desde la versión 2.6.15 del kernel, este archivo es pollable: después de abrir el archivo para lectura, un cambio en este archivo (es decir, montar un sistema de archivos o desmonte) provoca seleccione (2) para marcar el descriptor de archivo como legible, y sonde (2) y epoll_wait (2) marque el archivo como si tuviera una condición de error.
Se preguntó por qué inotify no funciona en/etc/mtab y encontró esta página de manual.
inotify solo le informa sobre desmontajes, y uevents ya no le informa sobre montar/desmontar.
La manera de hacerlo es sondear en/proc/mounts, leer en los contenidos, hacer un seguimiento de los montajes que ha visto y luego volver a analizar cuándo se levanta el sondeo. La encuesta se activará en ERR/PRI cuando se monte o se monte cualquier sistema de archivos.
#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 simplemente imprime los puntos de montaje en el inicio, y luego en cualquier montaje/desmontaje.Depende de ti el "diff" para descubrir qué se agregó/eliminó.
Nota, todas estas técnicas han sido inestables y/o rotas en versiones anteriores de Linux. Todo se estabilizó al final de Linux 2.6.35 (o tal vez un poco antes).
La alternativa es poner un reloj 'inotify' en'/etc/mtab', y hacer el mismo tipo de análisis que en '/ proc/mounts'. Pero esto es mucho más frágil. –
No estoy seguro de que existan acciones 'mount' de' uevent' en el núcleo ahora. Parece que fue [considerado como roto y eliminado] (https://lkml.org/lkml/2006/2/22/169). –