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;
}

person qdii    schedule 26.02.2012    source источник


Ответы (1)


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

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

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

person Mat    schedule 26.02.2012
comment
sleep — это остаток неудачной предыдущей попытки с inotify_init1(IN_NONBLOCK), но спасибо за объяснение :) - person qdii; 26.02.2012
comment
Я только что протестировал с помощью echo a >> /home/qdii/test, и он отлично работает. Еще раз спасибо. - person qdii; 26.02.2012
comment
о, и кстати, я наблюдаю за модификацией файлов, а не за их удалением. Не то чтобы это что-то меняет. - person qdii; 26.02.2012
comment
Вы бы заметили такое поведение, если бы тоже наблюдали за удалениями. - person Mat; 26.02.2012