首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >当我修改我的文件时发送kevent NOTE_DELETE

当我修改我的文件时发送kevent NOTE_DELETE
EN

Stack Overflow用户
提问于 2012-05-30 00:33:43
回答 1查看 524关注 0票数 4

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

所以我初始化了kqueue

代码语言:javascript
运行
复制
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 ...为什么?

EN

回答 1

Stack Overflow用户

发布于 2015-05-02 18:50:25

正如arri在评论中所解释的那样:

许多应用程序和框架在保存时实际上不会覆盖您的文件。相反,它们创建一个新的临时文件,对其进行写入,将属性从旧文件复制到临时文件(这会触发NOTE_ATTRIB),然后将临时文件重命名为您的旧文件(这会触发NOTE_DELETE)。

这被称为“原子存储”。优点是它是原子的:要么整个保存工作正常,要么什么都没有改变;即使有人在最糟糕的时候意外拔出硬盘,也不会导致文件损坏或不完整。而且,虽然丢失自上次保存以来的所有更改可能是不好的,但丢失文件的最后90%通常更糟糕。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10803181

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档