Событие inotify IN_MODIFY, происходящее дважды для tftp

Я использую inotify для прослушивания изменений в файле.

Когда я тестирую изменение файла, программа работает нормально.

# echo "test" > /tftpboot/.TEST

Output:
Read 16 data
IN_MODIFY

Но когда я делаю tftp put, генерируются два события:

tftp>  put .TEST
Sent 6 bytes in 0.1 seconds
tftp>

Output:
Read 16 data
IN_MODIFY
Read 16 data
IN_MODIFY

Есть идеи, как избежать дублирования уведомлений?

Код приведен ниже:

#include <sys/inotify.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <sys/types.h>
#include <iostream>

using namespace std;

int main(int argc, const char *argv[])
{
    int fd = inotify_init();
    if (fd < 0)
    {
        cout << "inotify_init failed\n";
        return 1;
    }
    int wd = inotify_add_watch(fd, "/tftpboot/.TEST", IN_MODIFY);
    if (wd < 0)
    {
        cout << "inotify_add_watch failed\n";
        return 1;
    }
    while (true)
    {
        char buffer[sizeof(struct inotify_event) + NAME_MAX + 1] = {0};
        ssize_t length;

        do
        {
            length = read( fd, buffer, sizeof(struct inotify_event));
            cout << "Read " << length << " data\n";
        }while (length < 0);

        if (length < 0)
        {
            cout << "read failed\n";
            return 1;
        }

        struct inotify_event *event = ( struct inotify_event * ) buffer;
        if ( event->mask & IN_ACCESS )
            cout << "IN_ACCESS\n";
        if ( event->mask & IN_CLOSE_WRITE )
            cout << "IN_CLOSE_WRITE\n";
        if ( event->mask & IN_CLOSE_NOWRITE )
            cout << "IN_CLOSE_NOWRITE\n";
        if ( event->mask & IN_MODIFY )
            cout << "IN_MODIFY \n";
        if ( event->mask & IN_OPEN )
            cout << "IN_OPEN\n";
    }

    inotify_rm_watch( fd, wd );
    close (fd);

    return 0;
}

1 ответ

Решение

Попробуйте использовать IN_CLOSE_WRITE вместо

Q: В чем разница между IN_MODIFY и IN_CLOSE_WRITE?

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

Q: лучше использовать IN_MODIFY или IN_CLOSE_WRITE?

Это варьируется от случая к случаю. Обычно более целесообразно использовать IN_CLOSE_WRITE, потому что, если он получен, все изменения в соответствующем файле безопасно записываются в файл. Событие IN_MODIFY не обязательно означает, что изменение файла завершено (данные могут остаться в буферах памяти в приложении). С другой стороны, многие журналы и подобные файлы должны отслеживаться с использованием IN_MODIFY - в тех случаях, когда эти файлы постоянно открыты и, следовательно, IN_CLOSE_WRITE не может быть отправлено.

источник

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