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

StackOverflow https://stackoverflow.com/questions/1113176

  •  12-09-2019
  •  | 
  •  

Вопрос

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

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

Это было полезно?

Решение

Я не думаю, что ты сможешь сделать это с inotify.Однако вот метод:

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

Другие советы

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

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

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

В современных системах 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

процедура(5) справочная страница говорит, что вам действительно не нужно использовать inotify для этого файла, он доступен для опроса:

Со времен ядра версии 2.6.15 этот файл загрязнен:После открытия файла для чтения, изменение в этом файле (то есть, монтирование или Unmount файловой системы) приводит к тому, что Select (2) отмечает дескриптор файла как читаемый, и опрос (2) и Epoll_Wait (2) отмечают файл как имеющий файл. Условие ошибки.

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

Если ты не против много ложных тревог, вы можете отслеживать close_nowrite на /etc/fstab..Смотрю /etc/mtab, /proc/mounts, и т. д.у меня не работает.

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 (или, может быть, немного раньше).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top