Как я могу определить, когда каталог смонтирован с помощью inotify?
Вопрос
Я использую Linux Inotify для обнаружения событий FS в своей программе.
Как я могу получить уведомление, когда устройство смонтировано в отслеживаемом каталоге?
Решение
Я не думаю, что ты сможешь сделать это с inotify
.Однако вот метод:
- Читать события из ядра через Нетлинк сокет и отфильтровать те, где
"ACTION"
не является"mount"
. - Прочтите и разберите
"/proc/mounts"
когда вы получаете событие с"mount"
действие. - Найдите запись о точке монтирования с только что смонтированным устройством и отфильтруйте ее, если это не тот каталог, который вы просматриваете.
Другие советы
РЕДАКТИРОВАТЬ: Обновление должно устареть менее чем на 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 (или, может быть, немного раньше).