我修改文件时发送了kevent NOTE_DELETE

时间:2012-05-29 16:33:43

标签: objective-c macos kqueue

我尝试在文件上使用kqeue和kevent,当我的文件被修改时,我将更新我的软件。当我的文件被删除时,我删除了我软件中的链接。

所以我初学kqueue

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 ......为什么?

1 个答案:

答案 0 :(得分:3)

如到达评论中所解释的那样:

许多应用程序和框架在保存时实际上都不会覆盖您的文件。相反,他们创建一个新的临时文件,写入该文件,将旧文件中的属性复制到临时文件(触发NOTE_ATTRIB),然后在旧文件上重命名临时文件(触发{{ 1}})。

这被称为"原子保存"。它的优点在于它的原子性:要么整个保存工作,要么没有任何改变;即使有人在最糟糕的时间意外拔出硬盘驱动器,也不可能出现乱码或不完整的文件。并且,虽然自上次保存以来丢失所有更改可能会很糟糕,但丢失最后90%的文件通常会更糟。