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

Я использую 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;
}

person m.divya.mohan    schedule 03.09.2015    source источник


Ответы (1)


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

Вопрос. В чем разница между IN_MODIFY и IN_CLOSE_WRITE?

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

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

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

источник

person Pat    schedule 06.09.2015