Como eu poderia detectar quando um diretório é montado com inotify?
Pergunta
Eu estou usando Linux Inotify para detectar eventos FS no meu programa.
Como eu poderia ser notificado quando um dispositivo é montado em um diretório monitorado?
Solução
Eu não acho que você pode fazê-lo com inotify
. Aqui está o método que:
- Leia uevents de kernel do através de um Netlink soquete e filtrar aqueles onde
"ACTION"
não é"mount"
. - Ler e analisar
"/proc/mounts"
quando você começa um evento com uma ação"mount"
. - Encontre um recorde para um ponto de montagem com o dispositivo que acabou de ser montado e filtrá-lo, se não é o diretório que você está assistindo.
Outras dicas
EDIT: Update para ser inferior a 5 anos obsoletos
Se você estiver em qualquer coisa, mas o mais antigo dos sistemas, libudev é o que você quer para o primeiro passo.
Se você estiver em algo a partir desta década, udisks vai fazer tudo isso para você também. Você precisaria para assistir ao org.Freedesktop.DBus.ObjectManager Interface em / org / freedesktop / UDisks2 para ver quando nova sistemas de arquivos transformar-se.
Em sistemas Linux modernos / etc / mtab frequentemente aponta para / proc / self / montagens:
$ 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 diz que você don' t realmente precisa usar inotify para este arquivo, é pollable:
Uma vez que o kernel versão 2.6.15, este arquivo é pollable: depois de abrir o arquivo para leitura, uma mudança neste arquivo (ou seja, montar um sistema de arquivos ou desmontar) causas select (2) para marcar o descritor de arquivo tão legível, e poll (2) e epoll_wait (2) marcar o arquivo como tendo uma condição de erro.
Foi perguntou por que inotify não funciona em / etc / mtab e encontrei esta página de manual.
Se você não se importa muitos de alarmes falsos, você pode ser capaz de prestar atenção para close_nowrite
em /etc/fstab
. . Assistindo /etc/mtab
, /proc/mounts
, etc. não funciona para mim.
inotify só informa sobre desmontagens e uevents não fala sobre montagem / desmontagem.
A maneira de fazer é pesquisar on / proc / mounts, ler no conteúdo, e manter o controle das montagens que você já viu, e depois de nova análise, quando a pesquisa acorda. A pesquisa vai acordar em ERR / PRI quando qualquer sistema de arquivos é montado ou 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;
}
O código acima apenas imprime os pontos de montagem no arranque, e em seguida, em qualquer montar / desmontar. É até você para "diff"-los para descobrir o que foi adicionado / removido.
Note, todas essas técnicas tem sido tanto instável e / ou quebrado nas versões anteriores do Linux. Tudo estável tem todo o final de Linux 2.6.35 (ou talvez um pouco mais cedo).