4

ファイルで kqueue と 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 を取得します...なぜですか?

4

1 に答える 1

3

コメントでarriが説明したように:

多くのアプリケーションやフレームワークは、保存時にファイルを実際に上書きしません。代わりに、新しい一時ファイルを作成し、そこに書き込み、属性を古いファイルから一時ファイルにコピーし (トリガーNOTE_ATTRIB)、一時ファイルの名前を古いファイルに上書きします (トリガーNOTE_DELETE)。

これを「アトミックセーブ」と呼びます。利点は、アトミックであることです。保存全体が機能するか、何も変更されません。最悪のタイミングで誰かが予期せずハード ドライブを取り外したとしても、ファイルが文字化けしたり不完全になったりすることはありません。最後に保存してからのすべての変更が失われるのは悪いことかもしれませんが、ファイルの最後の 90% が失われるのは通常、さらに悪いことです。

于 2015-05-02T10:50:25.100 に答える