4

私には次の(粗い)関数があります。この関数は、ディレクトリで新しいファイルや削除されているファイルを継続的に監視し、そのような変更を記録します。すべての新しいファイルとディレクトリを正しく記録しますが、削除されたファイルやディレクトリにはまったく反応しないようです。

これread()は、ファイルが作成されている場合は返されますが、ファイルが削除されている場合は返されない呼び出しのようです。

関数は2つの独立したスレッドの1つとして呼び出されていますが、現在、もう1つのスレッドは何もしません(プレースホルダーとしての空の無限ループのみ)。

void* watchfs(void* arg) {
    int infp, watch, length, i ;
    char buffer[EVENT_BUF_LEN] ;
    struct inotify_event* event ;

    if ((infp = inotify_init()) < 0) {
        fatal("inotify: Could not initialize") ;
    }

    watch = inotify_add_watch(infp, userdir, IN_CREATE | IN_DELETE) ;

    for (;;) {
        length = read(infp, buffer, EVENT_BUF_LEN) ;
        if (length < 0) {
            fatal("inotify: Could not read events") ;
        }

        i = 0 ;
        while (i < length) {
            event = (struct inotify_event*) &buffer[i] ;

            if (event->len) {
                if (event->mask & IN_CREATE) {
                    if (event->mask & IN_ISDIR) {
                        record(LOG_FILESYS, "New directory created") ;
                    } else {
                        record(LOG_FILESYS, "New file created") ;
                    }
                } else if (event->mask & IN_DELETE) {
                    if (event->mask & IN_ISDIR) {
                        record(LOG_FILESYS, "Directory deleted") ;
                    } else {
                        record(LOG_FILESYS, "File deleted") ;
                    }
                }
            }

            i += EVENT_SIZE + event->len ;
        }
    }

    inotify_rm_watch(infp, watch) ;
    close(infp) ;

    return 0 ;
}
4

1 に答える 1

5

最後に何が起こっているのかを理解しました。Linux、またはおそらくGnomeは、実際にはファイルを削除せず、単にファイルを移動します。ファイルの名前を変更しただけでも、明らかにどこかに移動された後、新しい名前の新しいファイルが別の場所(一時フォルダーのどこか?)からフォルダーに移動されます。コマンドはrm実際にファイルを削除し、私のコードはそれをIN_DELETEイベントとして期待どおりに登録します。ただし、Gnomeでファイルまたはディレクトリを削除すると、として登録されIN_MOVED_TO、レジスタの名前を変更すると、IN_MOVED_TOその後に。が続きIN_MOVED_FROMます。

私は最初にこれをチェックしたと思いましたが、明らかに十分ではありませんでした。

于 2011-12-09T14:42:28.300 に答える