inotify останавливает мониторинг файла, когда файл удаляется и создается снова - PullRequest
1 голос
/ 12 января 2011

Я сталкиваюсь с некоторой проблемой при использовании 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, кто-нибудь, как это?Спасибо.

Чэн

Ответы [ 3 ]

6 голосов
/ 12 января 2011

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

4 голосов
/ 12 января 2011

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

mask & IN_IGNORED

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

"Наблюдение было удалено явно (inotify_rm_watch (2)) или автоматически (файл был удален или файловая система была размонтирована)."

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

3 голосов
/ 12 января 2011

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

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

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

...