inotify не уведомляет, как я ожидал - PullRequest
2 голосов
/ 26 февраля 2012

Я создал этот небольшой фрагмент, чтобы попытаться понять, как работает inotify.Мой тест очень прост: я запускаю код, затем открываю / home / qdii / test в любом редакторе, изменяю его и сохраняю файл.Ничего не произошло.Я снова изменяю файл и сохраняю его, и отображается «событие получено».С этого момента, изменение файла снова больше не будет вызывать ничего.

Я ожидаю, что inotify будет выдавать «событие получено» каждый раз, когда файл изменяется.Что я сделал не так?

#include <errno.h>
#include <sys/inotify.h>
#include <fcntl.h>
#include <assert.h>
#include <unistd.h>
#include <iostream>
int main()
{
    const int fd = inotify_init();
    inotify_add_watch(fd, "/home/qdii/test", IN_MODIFY);

    while (true)
    {
        const size_t buf_size = sizeof(struct inotify_event);
        char buf[buf_size]; 

        if (read(fd, buf, buf_size) >= 0)
            std::cout << "event received" << std::endl;

        sleep(1);
    }

    return 0;
}

1 Ответ

2 голосов
/ 26 февраля 2012

Это ожидается.Большинство редакторов не (всегда) редактируют файл на месте, но создают временные файлы и воспроизводят игры без ссылки / переименования при сохранении (чтобы не потерять данные).

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

Другое замечание: что sleep есть и ненужное, и контрпродуктивное.read блокирует, поэтому вы не будете тратить ЦП, когда ничего не происходит, а сон увеличивает ваш шанс пропустить события.

...