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?

Foi útil?

Solução

Eu não acho que você pode fazê-lo com inotify. Aqui está o método que:

  1. Leia uevents de kernel do através de um Netlink soquete e filtrar aqueles onde "ACTION" não é "mount".
  2. Ler e analisar "/proc/mounts" quando você começa um evento com uma ação "mount".
  3. 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).

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top