Как я могу определить, когда каталог смонтирован с помощью inotify? - PullRequest
9 голосов
/ 11 июля 2009

Я использую Linux Inotify для обнаружения событий FS в моей программе.

Как я могу получить уведомление, когда устройство смонтировано в контролируемом каталоге?

Ответы [ 5 ]

9 голосов
/ 11 июля 2009

Я не думаю, что вы можете сделать это с inotify. Вот метод, хотя:

  1. Считайте события из ядра через Netlink сокет и отфильтруйте те, где "ACTION" не "mount".
  2. Чтение и анализ "/proc/mounts" при получении события с действием "mount".
  3. Найдите запись для точки монтирования с только что подключенным устройством и отфильтруйте ее, если это не каталог, который вы просматриваете.
4 голосов
/ 16 июля 2009

РЕДАКТИРОВАТЬ: Обновление устарело менее чем на 5 лет

Если вы используете что-то, кроме самой древней из систем, libudev - это то, что вам нужно для первого шага.

Если вы что-то из этого десятилетия, udisks сделает все это и для вас. Вам нужно будет посмотреть интерфейс org.Freedesktop.DBus.ObjectManager на / org / freedesktop / UDisks2 , чтобы увидеть, когда появятся новые файловые системы .

2 голосов
/ 10 июля 2014

В современных системах Linux / etc / mtab часто указывает на / 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 говорит, что вам не нужно использовать inotify для этого файла, он может быть опрошен:

Начиная с версии ядра 2.6.15 этот файл подлежит опросу: после открытия файла для чтения происходит изменение в этом файле (то есть монтирование или размонтирование файловой системы) вызывает выберите (2), чтобы пометить дескриптор файла как читаемый, и опросите (2) и epoll_wait (2) помечают файл как имеющий условие ошибки.

Был удивлен, почему inotify не работает в / etc / mtab, и нашел эту страницу руководства.

1 голос
/ 17 октября 2016

inotify сообщает только о размонтировании, а uevents больше не говорит о монтировании / размонтировании.

Способ сделать это - опросить / proc / mounts, прочитать содержимое и отследить горы, которые вы видели, а затем повторить анализ, когда опрос проснется. Опрос активируется при ERR / PRI, когда любая файловая система смонтирована или отключена.

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

Приведенный выше код просто распечатывает точки монтирования при запуске, а затем при любом монтировании / размонтировании. От вас зависит, будут ли они "различаться", чтобы узнать, что было добавлено / удалено.

Обратите внимание, что все эти методы были нестабильны и / или не работали в предыдущих версиях Linux. Все это стало стабильным в конце Linux 2.6.35 (или, может быть, чуть раньше).

1 голос
/ 03 сентября 2012

Если вы не возражаете против лотов ложных срабатываний, вы можете наблюдать за close_nowrite на /etc/fstab. , Просмотр /etc/mtab, /proc/mounts и т. Д. У меня не работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...