Inotify не уведомляет, как я ожидал

Я создал этот небольшой фрагмент, чтобы попытаться понять, как работает 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 ответ

Решение

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

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

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

Другие вопросы по тегам