inotifyの使い方の実践

1565 ワード

inotifyは、ファイルが変更されたかどうか、削除されたかどうかなどを知るためにハンドルを傍受するために使用できます.
モニタファイルが修正削除する、データを再読み込みするコードは以下の通りである.
注目すべきポイントは、ubunutuで変更された多くのファイルポリシーが削除され、再構築されていることです(viでファイルを編集するなど)
ファイルが削除/再再構築されると、IN_が受信されます.DELETE_SELFメッセージとIN_IGNOREDメッセージ、そしてwatch_idはadd_からwatchから削除して、後でメッセージを受け取ることができません.
解決策は、再add_watch
また、fopenによってファイルが開かれ、閉じられていない場合はadd_watchでは正しいメッセージが全く得られません.
#define BUF_LEN (5 * (sizeof(struct inotify_event) + NAME_MAX + 1))
#define WATCHED_FILE  xxx

void thread_run()
{

    int fd = inotify_init();

    if (fd < 0) {
        ALOGE("inotify_init failed - err=%d", errno);
        return false;
    }

    int wd = inotify_add_watch(fd, WATCHED_FILE, IN_DELETE_SELF|IN_MODIFY);
    if (wd < 0) {
       ALOGE("inotify_add_watch failed - err=%d", errno);
       return false;
    }

    while (true) {
        char buf[BUF_LEN] __attribute__ ((aligned(8)));
        int numRead;
        char *p;
        struct inotify_event *event;


        numRead = read(fd, buf, BUF_LEN);
        for (p = buf; p < buf + numRead; ) {
            event = (struct inotify_event *) p;
            if (event->mask & IN_DELETE_SELF) {
                usleep(500000); // waiting file re-created
                //do read and update ...;
                inotify_add_watch(fd, WATCHED_FILE, IN_DELETE_SELF|IN_MODIFY );

            } else if ( event->mask & IN_MODIFY) {
                //do update ...;
            }
            p += sizeof(struct inotify_event) + event->len;
        }
    }