kevent NOTE_DELETE отправляется, когда я изменяю свой файл

Я пытаюсь использовать kqueue и kevent для файла, и когда мой файл будет изменен, я обновлю свое программное обеспечение. И когда мой файл удален, я удаляю ссылку в своем программном обеспечении.

Итак, я инициализирую очередь

void myfct(char * path)
{ 
int kq;
int event_fd;
struct kevent events_to_monitor[NUM_EVENT_FDS];
struct kevent event_data[NUM_EVENT_SLOTS];
void *user_data;
struct timespec timeout;
unsigned int vnode_events;

kq = kqueue();

event_fd = open(path, O_EVTONLY);
user_data = path;
timeout.tv_sec = 0;        
timeout.tv_nsec = 500000000;    

vnode_events = NOTE_DELETE |  NOTE_WRITE | NOTE_EXTEND | NOTE_ATTRIB | NOTE_LINK | NOTE_RENAME | NOTE_REVOKE;
EV_SET( &events_to_monitor[0], event_fd, EVFILT_VNODE, EV_ADD | EV_CLEAR, vnode_events, 0, user_data);

    while (42) 
    {
        int event_count = kevent(kq, events_to_monitor, NUM_EVENT_SLOTS, event_data, num_files, &timeout);

        if (event_count) 
        {
            // Display the right event in event_data[0].fflags
        }
        else 
        {
            NSLog(@"No event.\n");
        }
    }
}

затем, когда я позвоню kevent и изменю свой файл

я получаю событие NOTE_ATTRIB, а затем NOTE_DELETE... почему?


person kavaliero    schedule 29.05.2012    source источник
comment
ты когда-нибудь это понял? У меня такое же поведение на моем Mac. Я ожидаю, что модификация файла сгенерирует событие NOTE_WRITE, но это не так.   -  person hopia    schedule 03.08.2012
comment
Я думаю, что событие на Mac отличается, когда файл изменяется, osx удаляет узел и воссоздает его ... это единственное решение в моей голове, но, возможно, есть другое лучшее объяснение!   -  person kavaliero    schedule 09.08.2012
comment
Я думаю, что Кавальеро прав. это то, что называется «атомарным сохранением»: он создает новый файл, затем удаляет старый и переименовывает новый файл в исходное имя. это обычная практика на уровне (приложения) фреймворка, но не для функции OSX.   -  person arri    schedule 04.12.2012


Ответы (1)


Как объяснил arri в комментарии:

Многие приложения и фреймворки фактически не перезаписывают ваш файл при сохранении. Вместо этого они создают новый временный файл, записывают в него, копируют атрибуты из старого файла во временный файл (что вызывает NOTE_ATTRIB), затем переименовывают временный файл поверх вашего старого файла (что вызывает NOTE_DELETE).

Это называется «атомарным сохранением». Преимущество в том, что он атомарный: либо работает весь сейв, либо ничего не меняется; даже если кто-то неожиданно отключит жесткий диск в самый неподходящий момент, нет никаких шансов, что вы получите искаженный или неполный файл. И хотя потеря всех ваших изменений с момента последнего сохранения может быть плохой, потеря последних 90% вашего файла, как правило, еще хуже.

person abarnert    schedule 02.05.2015