inotify прекращает мониторинг файла, когда файл удаляется и создается снова

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

  •  10-10-2019
  •  | 
  •  

Вопрос

Я сталкиваюсь с некоторой проблемой при использовании inotify.Я использую inotify для отслеживания изменений в файлах.Вот мой код:

int fd = inotify_init();
int wd = inotify_add_watch(fd, "/root/temp", IN_ALL_EVENTS);
int bufSize = 1000;
char *buf = new char[bufSize];
memset(buf, 0, sizeof(buf));
int nBytes = read(fd, buf, bufSize - 1);
cout << nBytes << " bytes read" << endl;
inotify_event *eventPtr = (inotify_event *)buf;
int offset = 0;
while (offset < nBytes)
{
    cout << eventPtr->mask << endl;
    offset += sizeof(inotify_event) + eventPtr->len;
    eventPtr = (inotify_event *)(buf + offset);
}
delete []buf;

Если я удалю "/ root / temp" и заново создам такой файл, любые изменения в этом файле не будут отслеживаться inotify, кто-нибудь, как это происходит?Спасибо.

ченг

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

Решение

Это потому что inotify контролирует основные inode, не имя файла. Когда вы удаляете этот файл, iNode, который вы в настоящее время смотрите, становится недействительным, поэтому вы должны вызвать inotify_rm_watch. Анкет Если вы хотите отслеживать новый файл с одним и тем же именем, но другим iNode, вы должны обнаружить, когда он создается, контролируя его родительскую папку.

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

Два других ответа верны. Еще один полезный момент заключается в том, что Инотификация рассказывает вам, когда часы недействительны.

mask & IN_IGNORED

будет ненулевым. IN_IGNORED установлено, когда:

«Смотреть было удалено явно (inotify_rm_watch (2)) или автоматически (файл был удален, или файловая система была размонтирована)».

Таким образом, как отмечалось, когда это установлено, вы можете пересмотреть файл (и/или каталог, если файл еще не был воссоздан).

Всякий раз, когда вы используете API, ОЗНАКОМЬТЕСЬ С ДОКУМЕНТАЦИЕЙ.

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

Чтобы получить то, что вы хотите, вам нужно отследить каталог /root.Он сообщит о событии создания при добавлении файла.Если этот файл называется "temp", то вы можете добавить наблюдение за этим файлом.

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