В соответствии с руководством по proc, можно отслеживать изменения точки монтирования в системе linux, открыв "/ proc / mounts" и добавив дескриптор файла для чтения fd_set
в вызове select()
.
Следующий фрагменткода работает в Ubuntu 9.04, а не в Ubuntu 10.04 (с 2.6.32 ядром Linux):
int mfd = open("/proc/mounts", O_RDONLY, 0);
fd_set rfds;
struct timeval tv;
int rv;
FD_ZERO(&rfds);
FD_SET(mfd, &rfds);
tv.tv_sec = 5;
tv.tv_usec = 0;
int changes = 0;
while ((rv = select(mfd+1, &rfds, NULL, NULL, &tv)) >= 0) {
if (FD_ISSET(mfd, &rfds)) {
fprintf(stdout, "Mount points changed. %d.\n", changes++);
}
FD_ZERO(&rfds);
FD_SET(mfd, &rfds);
tv.tv_sec = 5;
tv.tv_usec = 0;
if (changes > 10) {
exit(EXIT_FAILURE);
}
}
Скомпилируемый фрагмент.
Дескриптор файла всегдачитается на одной машине, и, следовательно, он продолжает появляться в вызове select.Даже нет никаких изменений в креплениях.
Я что-то здесь упускаю?
Заранее благодарен за любую помощь!
man 5 proc:
/ proc / [pid] / mounts (начиная с Linux 2.4.19)
Это список всех файловых систем, которые в настоящее время смонтированы в пространстве имен монтирования процесса.Формат этого файла задокументирован в fstab (5).Начиная с версии ядра 2.6.15, этот файл доступен для опроса: после открытия файла для чтения изменение этого файла (т. Е. Монтирование или размонтирование файловой системы) приводит к тому, что select (2) помечает дескриптор файла как читаемый, и poll (2) и epoll_wait (2) помечают файл как имеющий условие ошибки.